企业级应用系统都是以数据为核心的,数据在系统内部体现为实体以及实体和实体之间的关系。无论是数据的增删改查、流程变迁、规则变换以及统计分析等,都跟实体脱离不了干系,在对实体的操作中,数据验证是重要的一步,系统的验证配置,可以减少很多繁琐的代码。在Java的分层架构中,从表示层到持久层,都需要对业务数据进行验证。
定义验证器
验证组合约束、多值约束
数据验证在 Java 分层结构的应用开发中占据着重要位置。Java EE 6 提出了 Bean Validation 规范,使用注解的方式对 Java Bean 进行约束验证,不局限于某一层次或者某一编程模型,灵活易用。本文将向您系统的介绍该规范的各种特性。
文章根据 Hibernate Validator 4.0 对 JSR303 规范的参考实现,做个随笔记录。
一、约束的定义
Bean Validation 规范对约束的定义包括两部分,一是约束注解, @NotNull 就是约束注解;二是约束验证器,每一个约束注解都存在对应的约束验证器,约束验证器用来验证具体的 Java Bean 是否满足该约束注解声明的条件。
@NotEmpty (message = "firstname may be empty") //验证提示 message
private String firstname;
一个典型的约束注解的定义应该至少包括如下内容
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) //应用范围
@Retention(RUNTIME) //运行时机
@Constraint(validatedBy = {NotEmptyValidator.class}) //和注解关联的验证器,实验验证的功能
public @interface NotEmpty {
String message() default "this string may be empty"; //验证输出消息
Class<?>[] groups() default { }; //约束所属组别
Class<? extends Payload>[] payload() default {};//负载
}
约束注解定义完成后,需要同时实现与该约束注解关联的验证器。约束验证器的实现需要扩展 JSR303 规范提供的接口 javax.validation.ConstraintValidator。该接口有两个方法,方法 initialize 对验证器进行实例化,它必须在验证器的实例在使用之前被调用,并保证正确初始化验证器,它的参数是约束注解;方法 isValid 是进行约束验证的主体方法,其中 value 参数代表需要验证的实例,context 参数代表约束执行的上下文环境。
public interface ConstraintValidator<A extends Annotation, T> {
void initialize(A constraintAnnotation);
boolean isValid(T value, ConstraintValidatorContext context);
}
定义验证器
public class NotEmptyValidator implements ConstraintValidator<NotEmpty, String>{
public void initialize(NotEmpty parameters) {
}
public boolean isValid(String string,
ConstraintValidatorContext constraintValidatorContext) {
if (string == null) return false; //验证具体输入实例
else if(string.length()<1) return false;
else return true;
}
}
验证组合约束、多值约束