1、需要的相關jar
這里采用的是hibernate-validator-5.2.4.Final 和validation-api-1.1.0.Final 兩個jar包。Hibernate Validator 是 Bean Validation 的參考實現, Hibernate Validator 提供了 JSR 303 規范中所有內置 constraint 的實現,除此之外還有一些附加的 constraint。使用maven下載代碼如下:

1 <dependency> 2 <groupId>javax.validation</groupId> 3 <artifactId>validation-api</artifactId> 4 <version>1.1.0.Final</version> 5 </dependency> 6 <dependency> 7 <groupId>org.hibernate</groupId> 8 <artifactId>hibernate-validator</artifactId> 9 <version>5.2.4.Final</version> 10 </dependency>
2、文件的配置
springservlet-config.xml文件配置如下:

1 <mvc:annotation-driven validator="validator" 2 conversion-service="conversion-service" /> 3 <bean id="validator" 4 class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> 5 <property name="providerClass" value="org.hibernate.validator.HibernateValidator" /> 6 <property name="validationMessageSource" ref="validatemessageSource" /> 7 </bean> 8 <bean id="conversion-service" 9 class="org.springframework.format.support.FormattingConversionServiceFactoryBean" /> 10 <bean id="validatemessageSource" 11 class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 12 <property name="basename" value="classpath:i18n" /> 13 <property name="fileEncodings" value="utf-8" /> 14 <property name="cacheSeconds" value="120" /> 15 </bean>
其中<property name="basename" value="classpath:i18n" />是驗證錯誤后提示的消息所在的文件,需要在classpath路徑下添加,也可以自己設置路徑。
3、controller, user和i18n.properties代碼
UserControlelr代碼部分代碼如下:

1 package org.springframework.samples.myjpetstores.controller; 2 3 import javax.validation.Valid; 4 5 import org.springframework.samples.myjpetstores.io.User; 6 import org.springframework.stereotype.Controller; 7 import org.springframework.ui.ModelMap; 8 import org.springframework.validation.BindingResult; 9 import org.springframework.web.bind.annotation.RequestMapping; 10 11 @Controller 12 public class UserController { 13 @RequestMapping("/login") 14 public String userLogin(@Valid User user, BindingResult result, ModelMap model) 15 { 16 if(result.hasErrors()) 17 { 18 return "loginForm"; 19 } 20 return "index"; 21 } 22 }
代碼中需要注意的是,@Valid是必須的,只有加上@Valid,才會對傳過來的參數 User類進行驗證,后面必須緊跟着BindingResult result, 其中result是用來存放驗證錯誤信息的,它們之間是不能有任務參數的,是成對出現的,有多少個@Valid,就必須有多少個BindingResult result。
User類代碼

1 package org.springframework.samples.myjpetstores.io; 2 3 import org.hibernate.validator.constraints.NotEmpty; 4 5 public class User { 6 @NotEmpty(message="{username.not.empty}") 7 private String username; 8 @NotEmpty(message="{password.not.empty}") 9 private String password; 10 public String getUsername() { 11 return username; 12 } 13 public void setUsername(String username) { 14 this.username = username; 15 } 16 public String getPassword() { 17 return password; 18 } 19 public void setPassword(String password) { 20 this.password = password; 21 } 22 23 }
驗證錯誤后的消息文件:i18n.properties

1 username.not.empty=username is required. 2 password.not.empty=password is required.
其中name.not.empty和@NotEmpty(message="{username.not.empty}")的{}里的名字必須一致。
4、視圖界面
顯示錯誤信息界面:

1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 5 <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> 6 7 <html> 8 <head> 9 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 10 <title>Insert title here</title> 11 </head> 12 <body> 13 <form:form modelAttribute="user" method="post"> 14 <form:errors path="*"></form:errors> 15 <form:errors path="username"></form:errors> 16 <br /> 17 <br /> 18 </form:form> 19 </body> 20 </html>
其中需要注意的是<form:form modelAttribute="user" method="post">中的modelAttribute="user"和controller文件里的@Valid @ModelAttribute User user的@ModelAttribute一致,假如@ModelAttribute沒有設置名字,就默認為user,假如寫成@Valid @ModelAttribute("loginUser") User user,則 modelAttribute="loginUser" 否則不能進行數據綁定的。<form:errors path="*"></form:errors>的*表示所有的錯誤信息。<form:errors path="username"></form:errors>表示驗證username的錯誤信息。