jsr303 bean validation 上手

最近在做一个公司内部的平台型项目,打算开发一个SDK方便调用方调用,很自然的想到了在SDK中做校验,好处自不必多说。想到JavaEE6中的jsr303规范是做校验的,就先研究一下。

1. JSR303

JSR 303 – Bean Validation 是一个数据验证的规范,跟随JavaEE6发布。

每个校验规则是一个注解,自带的校验规则包括@NotNull,@Max,@min

每个校验规则都要对应一个校验器

2. 校验规则(约束)

定义一个校验规则就是定义一个注解
@Constraint(validatedBy = {RecordValidator.class}) 这行表示此校验规则对应的校验器是RecordValidator.java

1
2
3
4
5
6
7
8
@Constraint(validatedBy = {RecordValidator.class})
@Target( { ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface Record {
String message() default "格式错误";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}

3. 校验器

校验器要实现ConstraintValidator 接口,此接口有2个方法initializeisValid

isValid方法中,定义业务校验规则,通过返回true

1
2
3
4
5
6
7
8
public class RecordValidator implements ConstraintValidator<Record, String> {
public void initialize(Record record) {
}
public boolean isValid(String value,
ConstraintValidatorContext context) {
return (value.length() == 12) ? true : false;
}
}

4. Test

4.1 定义一个Bean

@Record注解属性

1
2
3
4
5
6
7
8
9
10
public class SmaUseDTO {
@Record
private String reCord;
public String getReCord() {
return reCord;
}
public void setReCord(String reCord) {
this.reCord = reCord;
}
}

4.2 测试

校验结果会保存在一个Set集合中。注意,校验结果中只保存了失败的结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static void main(String[] args) {
SmaUseDTO bean = new SmaUseDTO();
bean.setReCord("22");
// 获取校验器
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
// 校验
Set<ConstraintViolation<SmaUseDTO>> constraintViolations = validator.validate(bean);
// 校验结果
for (ConstraintViolation<SmaUseDTO> constraintViolation : constraintViolations) {
System.out.println(constraintViolation.getPropertyPath().toString() +": "+ constraintViolation.getMessage());
}
}

5. 自定义错误提示

默认错误文件在classpath根路径下,名为ValidationMessages.properties

1
javax.validation.constraints.NotNull.message = 不能为NULL

6.常用的校验规则

1
2
@NotNull
@NotEmpty

特别说明,如果你要校验的Fild是一个集合的话,比如list,并且你想对集合总的元素进行校验,请在此Fild上加@Valid注解,否则,校验器不会集合中元素进行校验的


参考
clongjava.iteye.com/blog/1317649