代码地址
https://github.com/wheel-orga…
简介
hibernate-validator 是 Hibernate 项目中的一个数据校验框架,是 Bean Validation 的参考实现,hibernate-validator 除了提供了 JSR 303 规范中所有内置 constraint 的实现,还有一些附加的 constraint。
使用 hibernate-validator 能够将数据校验从业务代码中脱离出来,增加代码可读性,同时也让数据校验变得更加方便、简单。
官网地址:http://hibernate.org/validator/
如何使用
项目中已经引入了需要的 api,无需重复引入
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.16.Final</version>
</dependency>
在要校验的 POJO 上加上以下注解即可
注解 | 用途 |
---|---|
Valid | 递归的对关联的对象进行校验 |
AssertFalse | 用于 boolean 字段,该字段的值只能为 false |
AssertTrue | 用于 boolean 字段,该字段只能为 true |
DecimalMax(value) | 被注释的元素必须是一个数字,只能大于或等于该值 |
DecimalMin(value) | 被注释的元素必须是一个数字,只能小于或等于该值 |
Digits(integer,fraction) | 检查是否是一种数字的 (整数, 小数) 的位数 |
Future | 检查该字段的日期是否是属于将来的日期 |
FutureOrPresent | 判断日期是否是将来或现在日期 |
Past | 检查该字段的日期是在过去 |
PastOrPresent | 判断日期是否是过去或现在日期 |
Max(value) | 该字段的值只能小于或等于该值 |
Min(value) | 该字段的值只能大于或等于该值 |
Negative | 判断负数 |
NegativeOrZero | 判断负数或 0 |
Positive | 判断正数 |
PositiveOrZero | 判断正数或 0 |
NotNull | 不能为 null |
Null | 必须为 null |
Pattern(value) | 被注释的元素必须符合指定的正则表达式 |
Size(max, min) | 检查该字段的 size 是否在 min 和 max 之间,可以是字符串、数组、集合、Map 等 |
Length(max, min) | 判断字符串长度 |
CreditCardNumber | 被注释的字符串必须通过 Luhn 校验算法,银行卡,信用卡等号码一般都用 Luhn 计算合法性 |
被注释的元素必须是电子邮箱地址 | |
Length(min=, max=) | 被注释的字符串的大小必须在指定的范围内 |
NotBlank | 只能用于字符串不为 null,并且字符串 trim()以后 length 要大于 0 |
NotEmpty | 集合对象的元素不为 0,即集合不为空,也可以用于字符串不为 null |
Range(min=, max=) | 被注释的元素必须在合适的范围内 |
SafeHtml | classpath 中要有 jsoup 包 |
ScriptAssert | 要有 Java Scripting API 即 JSR 223(“Scripting for the JavaTMPlatform”)的实现 |
URL(protocol=,host=,port=,regexp=,flags=) | 被注释的字符串必须是一个有效的 url |
更多功能,如:自定义校验规则、分组校验、关联参数联合校验请查看官网或百度
Dubbo 中使用 Hibernate Validator 校验入参
无需 util,Dubbo 接口配置上的 validation 为 true 即可
在客户端验证参数
<dubbo:reference id="xxxService" interface="xxx.ValidationService" validation="true" />
在服务器端验证参数
<dubbo:service interface="xxx.ValidationService" ref="xxxService" validation="true" />
在代码里校验入参
//obj 为包含 Hibernate Validator 注解的 POJO
// 快速失败模式
ValidResult validResult = ValidationUtil.fastFailValidate(obj);
//obj 为包含 Hibernate Validator 注解的 POJO
// 全部校验模式
ValidResult validResult = ValidationUtil.allCheckValidate(obj);
样例
public class ParamTestDTO implements Serializable {
private static final long serialVersionUID = 7123882542534668217L;
@AssertTrue(message = "Error True")
private Boolean testTrue;
@AssertFalse(message = "Error False")
private Boolean testFalse;
@DecimalMax(value = "10", message = "Error StrMax")
private String testStrMax;
@DecimalMin(value = "1", message = "Error StrMin")
private String testStrMin;
@Max(value = 10, message = "Error Max")
private Integer testMax;
@Min(value = 1, message = "Error Min")
private Double testMin;
@Digits(integer = 2, fraction = 3, message = "Error Dig")
private BigDecimal testDig;
@Past(message = "Error Past")
private Date testPast;
@Future(message = "Error Future")
private Date testFuture;
@Null(message = "Error Null")
private String testNull;
@NotNull(message = "Error NonNull")
private String testNonNull;
@Pattern(regexp = "^[0-9]?[0-9]$", message = "Error Pattern")
private String testPattern;
@Size(min = 1, max = 10, message = "Error Size")
private List<String> testSize;
@Length(min = 1, max = 10, message = "Error Length")
private String testLength;
@NotBlank(message = "Error Blank")
private String testBlank;
@NotEmpty(message = "Error NotEmpty")
private String testEmpty;
@Range(min = 1, max = 10, message = "Error Range")
private String testRange;
}
单测:ValidationUtilTest
性能测试
结果如图: