zoukankan      html  css  js  c++  java
  • 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. }  

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

  • 相关阅读:
    arm gdbserver armlinuxgdb
    建立非模态对话框与在线程中建立非模态对话框
    AutoLock C++
    Uboot bootcmd 和bootargs
    SetRegistryKey
    飞凌OK6410 uboot支持网络
    uboot 源码修改 bootcmd,IP ,BOOTARGS等参数
    TextBox(richTextBox) 光标和滚动条到文本末尾
    Windbg中使用查找内存并设置访问断点
    opencv EXAMPLES 编译 VS2010 (C++)
  • 原文地址:https://www.cnblogs.com/exmyth/p/8661913.html
Copyright © 2011-2022 走看看