美文网首页
Java之@Validated注解参数校验

Java之@Validated注解参数校验

作者: 山巅自相见 | 来源:发表于2023-06-05 16:29 被阅读0次

    @Validated可以帮助我们对接口的请求参数进行判断,帮助我们对参数进行约束,可以用在类、方法和属性上。
    常用的参数注解示例:

    import javax.validation.constraints.*;
    import java.util.Date;
    
    // 带注释的元素只能为null
    @Null(message = "用户名有误")
    // 带注释的元素不能为null
    @NotNull(message = "用户名有误")
    // 带注释的元素不能为null 也不能为空 CharSequence类型计算字符序列的长度 Collection类型评估集合大小 Map类型估计映射大小 Array类型评估数组长度
    @NotEmpty(message = "用户名有误")
    // 带注释的元素不能为null 并且必须至少包含一个非空白字符
    @NotBlank(message = "用户名有误")
    String username;
    
    // 带注释的元素必须为false。支持的类型有 boolean 和 boolean null的元素被认为是有效的
    @AssertFalse(message = "该用户为会员")
    // 带注释的元素必须为true。支持的类型有 boolean 和 boolean null的元素被认为是有效的
    @AssertTrue(message = "该用户非会员")
    Boolean VIP;
    
    // 带注释的元素必须是一个数字,其值必须小于或等于指定的最大值 支持的类型有:BigDecimal、BigInteger、CharSequence、byte、short、int、long及其各自的包装器 null的元素被认为是有效的
    @DecimalMax(value = "130", message = "年龄有误")
    // 带注释的元素必须是一个数字,其值必须大于或等于指定的最小值 支持的类型有:BigDecimal、BigInteger、CharSequence、byte、short、int、long及其各自的包装器 null的元素被认为是有效的
    @DecimalMin(value = "0", message = "年龄有误")
    /*
    带注释的元素必须是可接受范围内的数字 支持的类型有:BigDecimal、BigInteger、CharSequence、byte、short、int和long,并且它们各自的包装类型 null的元素被认为是有效的
    integer 返回此数字可接受的最大整数位数
    fraction 返回此数字可接受的最小整数位数
     */
    @Digits(integer = 3, fraction = 1, message = "年龄有误")
    // 带注释的元素必须是一个数字,其值必须小于或等于指定的最大值。支持的类型包括:BigDecimal、BigInteger、byte、short、int和long,并且它们各自的包装类型
    @Max(value = 130, message = "年龄有误")
    // 带注释的元素必须是一个数字,其值必须大于或等于指定的最小值。支持的类型包括:BigDecimal、BigInteger、byte、short、int和long,并且它们各自的包装类型
    @Min(value = 0, message = "年龄有误")
    // 带注释的元素必须是一个严格的负数 即0被视为无效值 支持的类型包括:BigDecimal、BigInteger、byte、short、int、long、float、double以及它们各自的包装类型
    @Negative
    // 带注释的元素必须是一个严格意义上的正数 即0被视为无效值 支持的类型包括:BigDecimal、BigInteger、byte、short、int、long、float、double以及它们各自的包装类型
    @Positive
    // 带注释的元素必须是负数或0 支持的类型包括:BigDecimal、BigInteger、byte、short、int、long、float、double以及它们各自的包装类型
    @NegativeOrZero
    // 带注释的元素必须是正数或0 支持的类型包括:BigDecimal、BigInteger、byte、short、int、long、float、double以及它们各自的包装类型
    @PositiveOrZero
    /*
    带注释的元素大小必须介于指定的边界(包括边界)之间。
    min 返回大小元素必须大于或等于
    max 返回大小元素必须小于或等于
     */
    @Size(min = 0, max = 100)
    Integer age;
    
    // 字符串必须是格式正确的电子邮件地址。构成有效电子邮件地址的确切语义留给雅加达Bean验证提供商。接受CharSequence类型 null的元素被认为是有效的
    @Email(message = "邮箱格式有误")
    String Email;
    
    // 带注释的元素必须是将来的即时、日期或时间 支持的类型包括:Date、Calendar、LocalDate、LocalDateTime、LocalTime、MonthDay、OffsetDateTime、OffsetTime、Year、YearMonth、ZonedDateTime
    @Future(message = "预定时间有误")
    // 带注释的元素必须是过去的即时、日期或时间 支持的类型包括:Date、Calendar、LocalDate、LocalDateTime、LocalTime、MonthDay、OffsetDateTime、OffsetTime、Year、YearMonth、ZonedDateTime
    @Past
    Date scheduledTime;
    
    // 带注释的元素必须与指定的正则表达式匹配。正则表达式遵循Java正则表达式约定请 null元素被认为是有效的
    @Pattern(regexp = "^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\\d{8}$", message = "手机号码有误")
    Integer mobilePhoneNumber;
    

    上述示例一个元素上有多个注解仅为展示作用,实际编写代码是一个足以,但是像@Max@Min等有的注解可以组合使用

    使用该注解需要做一个全局异常捕捉,不使用全局异常捕捉报错:

    2023-06-06 16:24:00.000  WARN 9796 --- [nio-8080-exec-3] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] in public java.lang.String com.iyunfish.shoujifeng.advice.UserVO: [Field error in object 'UserVO' on field 'username': rejected value [null]; codes [NotBlank.UserVO.username,NotBlank.username,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [UserVO.username,username]; arguments []; default message [username]]; default message [用户名有误]] ]
    

    不太好看并且也不实用,所以需要添加异常捕捉并且记录下问题并打印日志

    import com.iyunfish.shoujifeng.response.Response;
    import org.springframework.http.HttpStatus;
    import org.springframework.validation.*;
    import org.springframework.web.bind.MethodArgumentNotValidException;
    import org.springframework.web.bind.annotation.*;
    
    import java.util.List;
    
    /********************************************************************************
     ** date:2023/06/06
     ** description&desc:全局休息控制器建议
     *********************************************************************************/
    @ControllerAdvice
    public class GlobalRestControllerAdvice {
      /**
       * 处理@Validated参数校验失败异常
       *
       * @param exception 异常类
       * @return {@link Response }<{@link String }>
       */
      @ExceptionHandler(MethodArgumentNotValidException.class)
      @ResponseBody
      @ResponseStatus(HttpStatus.BAD_REQUEST)
      public Response<String> exceptionHandler(MethodArgumentNotValidException exception) {
        BindingResult result = exception.getBindingResult();
        StringBuilder stringBuilder = new StringBuilder();
        if (result.hasErrors()) {
          List<ObjectError> errors = result.getAllErrors();
          errors.forEach(p -> {
            FieldError fieldError = (FieldError) p;
            stringBuilder.append(fieldError.getDefaultMessage());
          });
        }
        return Response.fail(stringBuilder.toString());
      }
    }
    

    相关文章

      网友评论

          本文标题:Java之@Validated注解参数校验

          本文链接:https://www.haomeiwen.com/subject/ckxwedtx.html