【问题标题】:How to implement multiple JSR-303 validation messages for the same @Constraint?如何为同一个 @Constraint 实现多个 JSR-303 验证消息?
【发布时间】:2014-11-07 16:26:05
【问题描述】:

我正在使用 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 的回答添加示例代码解决方案。
  • 谢谢,很高兴它有帮助。现在已更新解决方案并迁移到答案中。

标签: java hibernate annotations bean-validation hibernate-validator


【解决方案1】:

正如 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;
}

【讨论】:

  • buildConstraintViolation 方法包含如下内容:context.buildConstraintViolationWithTemplate("{error.tmp}").addConstraintViolation(); 或者错误是否与属性相关联:context.buildConstraintViolationWithTemplate("{error.tmp}").addPropertyNode("propertyName").addConstraintViolation();
  • buildConstraintViolation 的定义似乎是这个答案的一大缺失。
  • @Hazok 同意 - 在我们的项目中使用此方法为所有违反约束的错误消息添加自定义前缀,但在示例中不需要这样做。现在已在答案中将其替换为单行以添加约束违规。
【解决方案2】:

查看传递给约束验证器的isValid 方法的ConstraintValidatorContext。它允许您自定义错误消息,其中包括根据您的验证状态使用不同的消息模板。

【讨论】:

  • 完美!正是我正在寻找但未能找到的东西 - 非常感谢。
猜你喜欢
  • 2012-06-15
  • 2015-01-10
  • 1970-01-01
  • 2012-07-27
  • 2011-08-09
  • 2023-03-29
  • 2011-05-31
  • 2013-04-08
  • 2011-10-30
相关资源
最近更新 更多