1、引入jar包
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.4.1.Final</version> </dependency> <dependency> <groupId>javax.el</groupId> <artifactId>javax.el-api</artifactId> <version>2.2.4</version> </dependency> <dependency> <groupId>org.glassfish.web</groupId> <artifactId>javax.el</artifactId> <version>2.2.4</version> </dependency>
注意:
- 當使用hibernate-validator更高版本時,會報一個java.lang.ClassNotFoundException: javax.el.ELManager錯誤,目前博主還未找到兼容的方案,因此采用了5.4.1.Final版本。
- 當不添加javax.el-api和javax.el依賴時,項目也可以運行,因為tomcat容器包含hibernate-validator所依賴的類
2、spring-mvc配置
<mvc:annotation-driven conversion-service="conversionService" validator="validator"/> <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> <property name="providerClass" value="org.hibernate.validator.HibernateValidator"></property> <property name="validationMessageSource" ref="messageSource"></property> </bean> <!-- 檢驗錯誤信息資源配置文件 --> <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <property name="basenames"> <list> <value>classpath:validator/validationMessages</value> </list> </property> <!-- 資源文件編碼格式 --> <property name="fileEncodings" value="utf-8"/> <!-- 對資源文件內容的緩存時間,單位秒 --> <property name="cacheSeconds" value="120"/> </bean>
3、在實體上增加相應注解校驗信息
private Integer stuId; @NotBlank(message = "{notnull}") @Size(max = 20, min = 2, message = "姓名長度在2-20之間") private String name; @Max(value = 200, message = "最大年齡200歲") @Min(value = 6, message = "最小年齡6歲") private Integer age;
注意:
message=“{notnull}”會去配置的錯誤文件中查找,即validator/validationMessages.properties文件中查找notnull的配置對應的錯誤信息。
4、使用方式
a) 自動校驗
在實體上增加@Validated注解,表示要校驗這個實體。BindingResult用於接收驗證后的錯誤信息。
@RequestMapping(value = "/add", method = { RequestMethod.GET, RequestMethod.POST }) public String addStudent(Model model, HttpServletRequest request, @Validated Student stu, BindingResult bindingResult) { if (HttpRequestContext.GET.equalsIgnoreCase(request.getMethod())) { return "prictice/student/addStudent"; } else { if (bindingResult.hasErrors()) { List<ObjectError> errors = bindingResult.getAllErrors(); model.addAttribute("errors", errors); return "prictice/student/addStudent"; } stu.setRegTime(new Date()); stu.setStatus(true); studentService.addStudent(stu); return "redirect:/student/list"; } }
b) 主動校驗
通過工具類,主動驗證某個實體類
新建工具類ValidateUtil.java
public class ValidateUtil { public static <T> void validate(T obj) { LocalValidatorFactoryBean validator = (LocalValidatorFactoryBean) SpringContextHolder.getBean("validator"); Set<ConstraintViolation<T>> constraintViolations = validator.validate(obj); Iterator<ConstraintViolation<T>> iter = constraintViolations.iterator(); while (iter.hasNext()) { ConstraintViolation<T> error = iter.next(); StringBuffer buffer = new StringBuffer().append("[") .append(error.getPropertyPath().toString()).append("]") .append(error.getMessage()); throw new IllegalArgumentException(buffer.toString()); } } }
或者可以使用下面的代碼獲取validator
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
調用
@RequestMapping(value = "/add") public String addStudent(@RequestParam Student stu) { ValidateUtil.validate(stu); return "redirect:/student/list" }
5、常用注解
注解 |
作用 |
AssertTrue |
布爾值為真 |
AssertFalse |
布爾值為假 |
Null |
引用為空 |
NotNull |
引用不為空 |
NotEmpty |
字符串引用和值都不是空 |
Min |
數字的最小值 |
Max |
數字的最大值 |
Past |
日期必須是過去 |
Future |
日期必須是未來 |
Pattern |
字符串必須匹配正則表達式 |
Valid |
遞歸驗證引用 |
Size |
驗證字符串是否在Size范圍內 |
|
驗證字符串是否是一個有效的電子郵箱 |
URL |
字符串是否是一個有效的URL |
注意:
- @NotEmpty 用在集合類上面
- @NotBlank 用在String上面
- @NotNull 用在基本類型上
- @Email和@URL是Hibernate Validator自定義的,假如使用其他的Bean Validation實現,可能沒有這兩個注解。
- 和JPA注解一樣,如果驗證注解添加到字段上,Hibernate就會直接讀取字段的值。如果注解到Getter方法上,Hibernate就會調用方法取得值。在一個類中不要同時應用這兩種方式,會導致重復驗證的問題。
- 如果在一個集合上應用Valid注解, Hibernate就會遞歸驗證集合中的每一個元素。