1. @valid和校验注解

  1. 方法跟实体配合使用

    1. 实体
      1. image.png
    2. 方法

      1. image.png

        2. @Validated和校验注解

        1. 类与方法参数配合使用

    3. image.png

      2. 使用swagger文档时出现的问题

      1. 当使用了2的验证方式出现了,参数变成了json,跑到了body中,找出了无法加载参数值

      ```java @RestController @RequestMapping(“user”) @Validated @Api(tags = “user - user”) public class UserController { @ApiOperation(“user - testNotBlank”)

    @ApiMapping(value = “testNotBlank”,checkToken = false) public ResultVO login(@NotBlank(message =”userName不能为空”) String userName, String test) { return ResultVO.success(userName); } }

    1. ![image.png](https://cdn.nlark.com/yuque/0/2020/png/1642320/1597317298287-dc1ae541-efa8-405a-9a30-977d442f8845.png#crop=0&crop=0&crop=1&crop=1&height=446&id=TUK70&margin=%5Bobject%20Object%5D&name=image.png&originHeight=446&originWidth=1435&originalType=binary&ratio=1&rotation=0&showTitle=false&size=39420&status=done&style=none&title=&width=1435)![image.png](https://cdn.nlark.com/yuque/0/2020/png/1642320/1597317325658-c8ecc5cb-fc20-4532-a8f9-d1c8f47f23f6.png#crop=0&crop=0&crop=1&crop=1&height=382&id=L28IY&margin=%5Bobject%20Object%5D&name=image.png&originHeight=382&originWidth=1529&originalType=binary&ratio=1&rotation=0&showTitle=false&size=56822&status=done&style=none&title=&width=1529)
    2. <a name="HIzGd"></a>
    3. ### 1. 解决方法
    4. 1. 使用@RequestParam
    5. ```java
    6. @ApiOperation("user - testNotBlank")
    7. @ApiMapping(value = "testNotBlank",checkToken = false)
    8. public ResultVO login(@RequestParam @NotBlank(message ="userName不能为空") String userName, String test) {
    9. return ResultVO.success(userName);
    10. }
    1. 使用@paramType
      1. @ApiOperation("user - testNotBlank")
      2. @ApiMapping(value = "testNotBlank",checkToken = false)
      3. @ApiImplicitParams({
      4. @ApiImplicitParam(name = "userName",value = "用户名",type = "String",paramType = "query"),
      5. @ApiImplicitParam(name = "test",value = "test",type = "String",paramType = "query"),
      6. })
      7. public ResultVO login(@NotBlank(message ="userName不能为空") String userName, String test) {
      8. return ResultVO.success(userName);
      9. }

3. 验证注解

  • @Null 限制只能为null
  • @NotNull 限制必须不为null
  • @AssertFalse 限制必须为false
  • @AssertTrue 限制必须为true
  • @DecimalMax(value) 限制必须为一个不大于指定值的数字
  • @DecimalMin(value) 限制必须为一个不小于指定值的数字
  • @Digits(integer,fraction) 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
  • @Future 限制必须是一个将来的日期
  • @Max(value) 限制必须为一个不大于指定值的数字
  • @Min(value) 限制必须为一个不小于指定值的数字
  • @Past 限制必须是一个过去的日期
  • @Pattern(value) 限制必须符合指定的正则表达式
  • @Past 验证注解的元素值(日期类型)比当前时间早
  • @NotEmpty 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
  • @NotBlank 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
  • @Email 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式
  • @Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之
  • @Length(min=, max=) 验证字符串长度是否在给定的范围之内 | 注解名称 | 功能 | | —- | —- | | @Null | 检查该字段为空 | | @NotNull | 不能为null | | @NotBlank | 不能为空,常用于检查空字符串 | | @NotEmpty | 不能为空,多用于检测list是否size是0 | | @Max | 可用于数字和字符串(字符串必须为数值型),其值必须小于等于指定的最大值 | | @Min | 可用于数字和字符串(字符串必须为数值型),其值必须大于等于指定的最小值 | | @Past | 检查该字段的日期是在过去 | | @Future | 检查该字段的日期是否是属于将来的日期 | | @Email | 检查是否是一个有效的email地址 | | @Pattern(regex=,flag=) | 被注释的元素必须符合指定的正则表达式 | | @Range(min=,max=,message=) | 被注释的元素必须在合适的范围内 | | @Size(min=, max=) | 检查该字段的size是否在min和max之间,可以是字符串、数组、集合、Map等 | | @Length(min=,max=) | 检查所属的字段的长度是否在min和max之间,只能用于字符串 | | @AssertTrue | 用于boolean字段,该字段只能为true | | @AssertFalse | 该字段的值只能为false |

4. 全局异常捕获处理错误格式

  1. @ExceptionHandler(MethodArgumentNotValidException.class)
  2. public ResultVO<?> exception(MethodArgumentNotValidException e) {
  3. BindingResult bindingResult = e.getBindingResult();
  4. List<ObjectError> allErrors = bindingResult.getAllErrors();
  5. StringBuilder sb = new StringBuilder();
  6. allErrors.forEach(objectError -> {
  7. FieldError fieldError = (FieldError) objectError;
  8. sb.append(";").append(fieldError.getField()).append(":").append(fieldError.getDefaultMessage());
  9. });
  10. String message = sb.length() > 0 ? sb.substring(1) : sb.toString();
  11. return ResultVO.fail(ResultCodeEnum.CheckError.getCode(), message);
  12. }