前言
- 日常开发中,一般都会有参数校验,判空校验是最常见的。
- 如果每个接口都写一大推重复的校验,代码不够简洁且复用不强
- 所以可以使用
hibernate-validator
通过注解校验。
一、快速开始
- 本文以Springboot项目为例
1、导入依赖
<dependency> |
- 引入上面的依赖,springboot的配置类:
ValidationAutoConfiguration
会自动帮我们配置。
2、校验注解详解
- 常见注解:
注解 | 支持的类型 | 描述说明 |
---|---|---|
@AssertFalse |
Boolean, boolean | 检查带注释的元素是否为false |
@AssertTrue |
Boolean, boolean | 检查带注释的元素是否为true |
@DecimalMax |
BigDecimal, BigInteger, CharSequence, byte, short, int, long | 当inclusive = false 时,检查带注释的值是否小于指定的最大值。否则,该值是否小于或等于指定的最大值。 |
@DecimalMin |
BigDecimal, BigInteger, CharSequence, byte, short, int, long | 当inclusive = false 时,检查带注释的值是否大于指定的最小值。否则,该值是否大于或等于指定的最小值。 |
@Digits |
BigInteger, CharSequence, byte, short, int, long | 检查带注释的值是否是一个最多包含整数位数和小数位数的数字 |
@Email |
BigInteger, CharSequence, byte, short, int, long | 检查指定的字符序列是否为有效的电子邮件地址。可选参数regexp和flags允许指定电子邮件必须匹配的其他正则表达式 |
@Min |
BigInteger, CharSequence, byte, short, int, long | 检查带注释的值是否大于或等于指定的最小值 |
@Max |
BigInteger, CharSequence, byte, short, int, long | 检查带注释的值是否小于或等于指定的最大值 |
@NotBlank |
CharSequence | 检查带注释的字符序列不为null,并且修剪的长度大于0。与@NotEmpty 的区别在于,此约束只能应用于字符序列 |
@NotEmpty |
CharSequence,Collection,Map和数组 | 检查带注释的元素是否不为null或为空 |
@NotNull |
任何类型 | 检查注释的值是否不是 null |
@Negative |
BigDecimal,BigInteger,byte,short,int,long | 检查元素是否为负数。 |
@NegativeOrZero |
BigDecimal,BigInteger,byte,short,int,long | 检查元素是不是小于等于0。 |
@Null |
任何类型 | 检查注释的值是 null |
@Size |
CharSequence,Collection,Map和数组 | 检查带注释的元素的大小是否介于min和之间max(包括) |
3、使用方式
- 新建一个controller类,如下
|
- 在类上面使用:
@Validated
注解。 - 如果是Get请求,在方法参数上使用校验注解。
- 如果是
@RequestBody
方式,可在参数上使用@Valid
注解。
4、自定义全局异常
- 因为报错不太雅观,我们自定义全局异常捕获
- 如下:
/** |
- 使用
@RestControllerAdvice
注解,和@ExceptionHandler
注解实现,异常统一处理
二、自定义参数校验注解
- 本文的重点,默认的注解,可能没能符合我们的业务需要。
- 比如,有个字段性别(sex),它只能是
男
或者女
,我们可以自定义注解来判断传上来的参数是否符合
1、新建自定义注解
/** |
values()
代表它可以为的值enums()
代表它可以是一个枚举- 新建注解之后,还要为他创建一个验证器的类
/** |
- 需要实现
ConstraintValidator
的接口 - 重新
isValid()
方法即可,返回false代表失败,会提示message里面的内容 initialize()
方法可以初始化一些值,比如拿到注解上的值信息。
2、使用方法
- 和其他的注解使用方式一致,如下:
@Data |