创建自定义JSR303的验证约束

  • 首先定义一个约束注解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* @Target 表示注解可出现在哪些地方(这里是方法, 字段, 注解)
* @Retention 表示该注解的保存范围是哪里, RUNTIME表示在源码(source)、编译好的.class文件中保留信息,在执行的时候会把这一些信息加载到JVM中去
* @Constraint 表示哪个验证器提供验证
* @Documented 表明这个注解应该被 javadoc工具记录
* @interface 表明这是一个注解
*/
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = JSRDemo.class)
@Documented
public @interface Matches {
String message();

Class<?>[] groups() default {};

Class<? extends Payload>[] payload() default {};

int min();
int max();
}

上面的message(),groups()payload()这三个方法是一个标准的约束所具备的

int min()int max()是我们自己定义的(不能用Integer类型)

  • 实现这个验证器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class JSRDemo implements ConstraintValidator<Matches, Integer> {

private Integer min;
private Integer max;

@Override
public void initialize(Matches constraintAnnotation) {
min = constraintAnnotation.min();
max = constraintAnnotation.max();
}

/**
* 判断值是否大于最小值,小于最大值
* @param value
* @param context
* @return 满足条件返回true
*/
@Override
public boolean isValid(Integer value, ConstraintValidatorContext context) {
if (value > min && value < max) {
return true;
}
return false;
}
}

POJO

1
2
@Matches(message = "大于10小于20",max = 20,min = 10)
private Integer age;

Controller

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@RequestMapping("/insert")
public ModelAndView insert(@Valid Role role, BindingResult br) {
ModelAndView mv = new ModelAndView();
if (br.hasErrors()) {
List<FieldError> list = br.getFieldErrors();
for (FieldError error : list) {
System.out.println("field:"+error.getField()+","+"error:"+error.getDefaultMessage());
}
return null;
}
crudService.insert(role);
mv.setViewName("ok");
mv.addObject("msg", "增加成功");
return mv;
}
赏个🍗吧
0%