美文网首页
SpringBoot-javax.validation

SpringBoot-javax.validation

作者: 张明学 | 来源:发表于2020-05-02 23:47 被阅读0次

说明

本篇主要介绍javax的validation使用,以实际使用出发,后续会再更新,先记录一部分。

简介

javax的validation是基于标准JSR-303规范。JSR是Java Specification Requests的缩写,意思是Java 规范提案。是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。

JSR-303 是JAVA EE 6 中的一项子规范,叫做Bean Validation,Hibernate Validator 是 Bean Validation 的参考实现 . Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的实现,除此之外还有一些附加的 constraint。JSR-303参考

在SpringBoot中使用方法


  • 添加依赖
 <!-- Validation 相关依赖 -->
    <dependency>
      <groupId>javax.validation</groupId>
      <artifactId>validation-api</artifactId>
      <version>2.0.1.Final</version>
    </dependency>

由于SpringBoot中spring-boot-starter-web中引用了hibernate-validator、hibernate-validator又引用了validation-api。因此不需要额外引用validation-api

  • 添加约束注解
    针对目标Bean,针对不同属性的验证需求,添加不同的约束注解。
public class UserReq implements Serializable {
    /**
     * 任意类型,验证注解的元素值不是null
     */
    @NotNull(message = "userName不能为空")
    private String userName;

    /**
     * BigDecimal,BigInteger, byte,short, int, long,等任何Number或CharSequence(存储的是数字)子类型
     *
     * @Min验证注解的元素值大于等于@Min指定的value值,
     * @Max验证注解的元素值小于等于@Max指定的value值
     */
    @Min(value = 18, message = "不能小于18岁")
    @Max(value = 60, message = "不能大于60岁")
    @NotNull
    private Integer userAge;

    /**
     * @Past必须是过去的一个时间
     * @Future必须是将来的一个时间
     */
    @Past(message = "birthday")
    @DateTimeFormat(pattern = "yyy-MM-dd")
    @JSONField(format = "yyyy-MM-dd")
    private Date birthday;

    /**
     * 字符串、Collection、Map、数组等。验证注解的元素值的在min和max(包含)指定区间之内,如字符长度、集合大小
     */
    @Size(min = 1, max = 3, message = "联系人信息不能为空")
    private List<ContactInfo> contactInfo;
}
  • 开启验证
    开启验证的方法有:
    验证注解:@Validated或者@Valid (@Validated注解的效果与@Valid是一样的,@Validated是SpringBoot对@Valid注解的封装(@Valid是javax.validation的注解)。而@Validated注解是包含在SpringBoot的spring-boot-web-starter中的。)
@PostMapping("/user")
    public String addUser(@RequestBody @Validated UserReq userReq) {
        log.info("保存User={}", JSON.toJSONString(userReq));
        return "SUCCESS";
    }

异常的捕捉。SpringBoot-异常处理

@ExceptionHandler({
            MethodArgumentNotValidException.class,
            BindException.class,
            ValidationException.class,
            ConstraintViolationException.class})
    @ResponseStatus(HttpStatus.OK)
    public BaseResponse tryValidationException(HttpServletRequest request, HandlerMethod handlerMethod, Exception e) {
        log.error("参数校验异常,url={},{}#{}", request.getRequestURL(), handlerMethod.getClass(), handlerMethod.getMethod().getName(), e);
        BindingResult result = null;
        if (e instanceof MethodArgumentNotValidException) {
            result = ((MethodArgumentNotValidException) e).getBindingResult();
        }
        StringBuilder errorMsg = new StringBuilder();
        for (ObjectError error : result.getAllErrors()) {
            errorMsg.append(error.getDefaultMessage()).append(",");
        }
        if (errorMsg.length() > 1) {
            errorMsg.delete(errorMsg.length() - 1, errorMsg.length());
        }
        return new BaseResponse().setCode("30").setMessage(errorMsg.toString());
    }

约束注解


  • 空值校验
    @Null:目标值为null。比如,注册时的userId当然是null(即使不为null,系统也不会采用的)。
    @NotNull:目标值不为null。比如,登录时的userId当然不为null(当然也可能是通过了外部鉴权,然后内部裸奔)。
    @NotEmpty:目标值不为empty。相较于上者,增加了对空值的判断(就是""无法通过@NotEmpty的校验)
    @NotBlank:目标值不为blank。相较于上者,增加了对空格的判断(就是空格无法通过@NotBlank校验的)

  • 范围校验
    @Min(value=值):针对数值类型,目标值不能低于该注解设定的值。
    @Max(value=值):针对数值类型,目标值不能高于该注解设定的值。
    @DecimalMax(value=值):针对数值类型,目标值必须小于该注解设定的值。
    @DecimalMin(value=值):针对数值类型,目标值必须大于该注解设定的值。
    @Digits(integer=整数位数, fraction=小数位数):针对数值类型,目标值的整数位数必须等于integer参数设定的值,小数位数必须等于fraction参数设定的值。
    @Size(min=下限, max=上限):针对:字符串、Collection、Map、数组等,目标集合的元素数量不可以高于max参数,不可以低于min参数。
    @Past:针对:java.util.Date,java.util.Calendar;Joda Time类库的日期类型,目标值必须是一个过去的时间。
    @Future:针对:java.util.Date,java.util.Calendar;Joda Time类库的日期类型,目标值必须是未来的时间。
    @Length(min=下限, max=上限) 针对:CharSequence子类型,验证注解的元素值长度在min和max区间内
    @Range(min=最小值, max=最大值),针对:BigDecimal,BigInteger,CharSequence, byte, short, int, long等原子类型和包装类型,验证注解的元素值在最小值和最大值之间。

  • 其他校验
    @AssertTrue:针对布尔类型,目标值必须为true。
    @AssertFalse:针对布尔类型,目标值必须为false。
    @Email:针对字符串类型,目标值必须是Email格式。
    @URL:针对字符串类型,目标值必须是URL格式。
    @Pattern:针对字符串类型,目标值必须通过注解设定的正则表达式

其中:@NotEmpty、@Length、@Range、@Email 是Hibernate Validator附加的。

相关文章

  • SpringBoot-javax.validation

    说明 本篇主要介绍javax的validation使用,以实际使用出发,后续会再更新,先记录一部分。 简介 jav...

网友评论

      本文标题:SpringBoot-javax.validation

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