Bean验证规范优先级

时间:2017-01-11 17:01:53

标签: java spring spring-boot thymeleaf bean-validation

我正在使用bean验证规范在spring-boot百万美元项目中验证我的表单。 我的实体财产如下。

@NotEmpty(message = "{Password should not be empty}")
@Pattern(regexp = //Pattern for range 1-20, message = "{Wrong Input}")
private String            password;

当我运行并输入具有空值的表单的密码字段时,显示了两个验证错误消息。

我的期望是,虽然输入空值,但只有@NotEmpty注释可以工作,另一方面,只有在用户输入错误时才会显示@Pattern。

如何处理Bean验证规范呢?

问候。

1 个答案:

答案 0 :(得分:4)

1。 Validation groups

@NotEmpty(groups = First.class), message = ...,          
@Pattern(groups = Second.class, regexp = ...)
private String password;

创建验证组:

//Validation Groups - Just empty interface used as Group identifier
public interface First {
}
public interface Second {
}

以这种方式验证模型:

Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
Set<ConstraintViolation<Model>> violations = validator.validate(model, First.class);

if(violations.isEmpty()){
     violations = validator.validate(model, Second.class);
}

2。 Groups Sequences

我从未使用它们,但它似乎只是你想要的

检查另一个答案(https://stackoverflow.com/a/7779681/641627)。我在这个答案(来自 @Gunnar )下面添加了一个引用,具有讽刺意味的是,它还使用了第一个第二个组名:< / p>

@GroupSequence({First.class, Second.class})
public interface Sequence {}

@Size(min = 2, max = 10, message = "Name length improper", groups = { First.class })
@Pattern(regexp = "T.*", message = "Name doesn't start with T" , groups = { Second.class })
private String name;
     

现在使用定义的序列验证Bean实例   (validator.validate(bean,Sequence.class)),首先是@Size   约束将被验证,并且只有在@Pattern成功时才会被验证   约束

使用此解决方案,您不需要手动调用validator.validate(...),如果失败,将按照序列中定义的顺序执行验证。