我有一个bean,我为每个字段定义了多个验证注释,例如
@NotEmpty
@Pattern(regexp="(\\-?\\d)+")
@Min(value=1)
String myField;
我遇到了两个一个我无法轻易解决的问题。
编辑。我尝试使用@ReportAsSingleViolation实现自定义复合约束。问题是它将为组合中涉及的所有违规报告相同的消息。这不是我需要的。
建议,拜托?
答案 0 :(得分:6)
应该可以使用validation groups和完全定义的validation group sequence
的组合来创建您想要实现的行为引自JSR-349 (aka. BeanValidation 1.1) spec, paragraph 4.4.2
处理组在第4.6节中定义;如果序列中处理的其中一个组生成一个或多个约束违规,则不得处理序列中的组。这样可确保仅在另一组约束为有效的。
由我强调
这应该相对容易,按Group Sequence Example
进行@GroupSequence({YourClass.class, Second.class, Third.class})
public class YourClass {
@NotNull
@Pattern(regexp="(\\-?\\d)+", groups=Second.class)
@Min(value=1, groups=Third.class)
String myField;
}
将Second
和Third
定义为简单的标记接口应该可以解决问题。请注意,在第一次违反约束之前,这不会验证所有字段,而是直到第一次完全违规。
这意味着在修复其他字段后,您的某些字段可能变得无效'违规。
如果所有其他方法都失败了,您仍然可以重新实现行为组件,验证提供程序。 您应该能够使用validation.xml
提供自己的ConstraintValidatorContext
实现
请注意您 违反ConstraintValidatorContext.ConstraintViolationBuilder
的合同:
要创建ConstraintViolation,必须调用其中一个 addConstraintViolation()方法在其中一个接口中可用 流畅的API。
如果在addConstraintViolation()之后调用另一个方法 ConstraintViolationBuilder或其任何关联对象
IllegalStateException
被提出。
答案 1 :(得分:1)
你可以compose your constraints。但是,对于任何指定的约束,您只会得到一个错误,不确定在您的用例中是否可接受。
答案 2 :(得分:0)
到目前为止,您必须使用其他答案中描述的@GroupSequence
解决方案。但是,Hibernate团队正在寻找具有JDK即将推出的功能的解决方案,甚至与OpenJDK开发人员合作:BVAL-248