一切从元编程开始
先看一个不使用Bean Validation校验数据的代码:
public class StandardValidation {
public static void main(String[] args) {
System.out.println(validationWithoutAnnotation(" ", -1));
}
public static String validationWithoutAnnotation(String inputString, Integer inputInt) {
String error = null;
if (null == inputString) {
error = "inputString不能为null";
} else if (null == inputInt) {
error = "inputInt不能为null";
} else if (1 > inputInt.compareTo(0)) {
error = "inputInt必须大于0";
} else if (inputString.isEmpty() || inputString.trim().isEmpty()) {
error = "inputString不能为空字符串";
} else {
// DO
}
return error;
}
}
相信很多码友多少都写过类似的代码。使用IF—ELSE是否优雅这种高端问题暂且不谈,但是大量的IF—ELSE会导致业务内容越来越多的嵌套在代码中。针对这些问题Bean Validation为数据校验提供了更加规范化、通用化、复用程度更高的校验方法。
数据校验的原理并不复杂,主要是用注解(Annotation)在域或setter方法上声明JavaBean中数据的准则。Java的数据校验代码主要在javax.validation包中,包括注解、校验器以及校验器工厂,接下来通过例子说明。(例子可执行代码在本人的gitee库,本文代码在chkui.springcore.example.javabase.validation包)
标准数据校验
JSR提交的Javax.validation定义中已经为数据校验定义了很多方法和注解,但是需要清晰的是JSR仅仅制定了一个规范,具体的功能是由各种框架实现的。本文的例子引入了Hibernate Validator 6.0.12.Final包,他与Spring Validator一样,都是根据JSR规范实现校验功能。
数据校验是围绕一个实体类展开的,下面的代码声明了一个实体类,通过注解标注每个域上的赋值规则:
package chkui.springcore.example.javabase.validation.entity;
public class Game {
@NotNull //非空
@Length(min=0, max=5) //字符串长度小于5,这个是一个Hibernate Validator增加的注解
private String name;