Hibernate-validator校验框架使用

可以有两种使用方法:

第一种:在要检验的Dto对象之前加@Valid注解,这种方法必须配合BindingResult参数一起使用,否则验证不通过就会返回400,并且抛出"org.springframework.validation.BindException"异常,举例如下。这种交互不利于前端获取校验信息,因此需要配合BindingResult对校验结果进行封装之后再返回给前端。

[java] view plain copy
 
  1. {  
  2.   "timestamp": 1489024472175,  
  3.   "status": 400,  
  4.   "error": "Bad Request",  
  5.   "exception": "org.springframework.validation.BindException",  
  6.   "errors": [  
  7.     {  
  8.       "codes": [  
  9.         "Range.userDto.age",  
  10.         "Range.age",  
  11.         "Range.int",  
  12.         "Range"  
  13.       ],  
  14.       "arguments": [  
  15.         {  
  16.           "codes": [  
  17.             "userDto.age",  
  18.             "age"  
  19.           ],  
  20.           "arguments": null,  
  21.           "defaultMessage": "age",  
  22.           "code": "age"  
  23.         },  
  24.         150,  
  25.         1  
  26.       ],  
  27.       "defaultMessage": "年龄必须介于1到150之间",  
  28.       "objectName": "userDto",  
  29.       "field": "age",  
  30.       "rejectedValue": 152,  
  31.       "bindingFailure": false,  
  32.       "code": "Range"  
  33.     }  
  34.   ],  
  35.   "message": "Validation failed for object='userDto'. Error count: 1",  
  36.   "path": "/test/login2"  
  37. }  

具体可以参考这个例子

第二种:将validation逻辑封装成工具类,使用工具类对dto进行校验,然后根据校验结果做响应的处理。封装好的一个工具类如下。

[java] view plain copy
 
  1. public class ValidationUtils {  
  2.   
  3.     private static Validator validator =  Validation.buildDefaultValidatorFactory().getValidator();  
  4.       
  5.     public static <T> ValidationResult validateEntity(T obj){  
  6.         ValidationResult result = new ValidationResult();  
  7.          Set<ConstraintViolation<T>> set = validator.validate(obj,Default.class);  
  8.          if( CollectionUtils.isNotEmpty(set) ){  
  9.              result.setHasErrors(true);  
  10.              Map<String,String> errorMsg = new HashMap<String,String>();  
  11.              for(ConstraintViolation<T> cv : set){  
  12.                  errorMsg.put(cv.getPropertyPath().toString(), cv.getMessage());  
  13.              }  
  14.              result.setErrorMsg(errorMsg);  
  15.          }  
  16.          return result;  
  17.     }  
  18.       
  19.     public static <T> ValidationResult validateProperty(T obj,String propertyName){  
  20.         ValidationResult result = new ValidationResult();  
  21.          Set<ConstraintViolation<T>> set = validator.validateProperty(obj,propertyName,Default.class);  
  22.          if( CollectionUtils.isNotEmpty(set) ){  
  23.              result.setHasErrors(true);  
  24.              Map<String,String> errorMsg = new HashMap<String,String>();  
  25.              for(ConstraintViolation<T> cv : set){  
  26.                  errorMsg.put(propertyName, cv.getMessage());  
  27.              }  
  28.              result.setErrorMsg(errorMsg);  
  29.          }  
  30.          return result;  
  31.     }  
  32. }  

具体实现可以参考这个例子