如何为同一个@Constraint实现多个JSR-303验证消息?

Ste*_*ers 3 java annotations hibernate hibernate-validator bean-validation

我正在使用JSR-303验证(hibernate-validator)来实现具有一些不同规则的实体.宁愿不@Constraint为这些注释堆叠多个注释,而是使用单个注释,例如@MyEntityConstraint.

问题是每种类型的验证失败确实需要有不同的消息,但消息似乎与注释密不可分:

public @interface MyEntityConstraint {
    String message() default "A single, unchangeable message per constraint???";
    // ...
}
Run Code Online (Sandbox Code Playgroud)

有什么方法围绕这个或我注定要:

@MyEntityConstraint1
@MyEntityConstraint2
// ...
@MyEntityConstraintn
@Entity
public class MyEntity {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*ers 8

正如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;
}
Run Code Online (Sandbox Code Playgroud)

  • `buildConstraintViolation`方法包含类似:`context.buildConstraintViolationWithTemplate("{error.tmp}").addConstraintViolation();`或者如果错误可以绑定到属性:`context.buildConstraintViolationWithTemplate("{error.tmp } ").addPropertyNode(" PROPERTYNAME")addConstraintViolation();` (2认同)

Har*_*rdy 6

看看ConstraintValidatorContext传递给isValid你的约束验证的方法.它允许您自定义错误消息,包括使用不同的消息模板,具体取决于您的验证状态.