我正在对一个实体使用 JSR-303 验证 (hibernate-validator),并应用一些不同的规则。宁愿不为这些堆叠多个 @Constraint
注释,而是使用单个注释,例如@MyEntityConstraint
。
问题是确实需要为每种类型的验证失败提供不同的消息,但该消息似乎与注释密不可分:
public @interface MyEntityConstraint {
String message() default "A single, unchangeable message per constraint???";
// ...
}
有什么办法解决这个问题还是我注定要有:
@MyEntityConstraint1
@MyEntityConstraint2
// ...
@MyEntityConstraintn
@Entity
public class MyEntity {
// ...
}
最佳答案
正如 Hardy 所建议的,这可以使用 ConstraintValidatorContext 来完成。 - 如下:
@Override
public boolean isValid(MyEntity myEntity, ConstraintValidatorContext context) {
// Disable default ConstraintViolation so a customised message can be set instead.
context.disableDefaultConstraintViolation();
return checkConstraint1(myEntity, context)
&& checkConstraint2(myEntity, context)
//...
&& checkConstraintn(myEntity, context);
}
// Note: A private method for each constraint decreases the cyclomatic complexity.
private boolean checkConstraint1(MyEntity myEntity, ConstraintValidatorContext context) {
// Default validity is true until proven otherwise.
boolean valid = true;
if (/*<<Insert constraint #1 conditions (about myEntity) here>>*/) {
valid = false;
context.buildConstraintViolationWithTemplate(
"<<Insert constraint #1 failure message here>>").addConstraintViolation();
}
return valid;
}
关于java - 如何为同一个@Constraint 实现多个JSR-303 验证消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26805669/