乐趣区

Hibernate-Validator更简洁的参数校验及一个util

代码地址

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 计算合法性
Email 被注释的元素必须是电子邮箱地址
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

性能测试

结果如图:

退出移动版