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

标签 java hibernate annotations bean-validation hibernate-validator

我正在对一个实体使用 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/

相关文章:

java - Java 中的 RequestDispatcher

java - Eclipse Android 异常 : Unhandled event loop exception No more handles

java - 如何在 Spring Boot 中为多个数据库编写 Controller 类?

java - PostgreSQL 自定义类型 + Hibernate 映射

java - @Digits 注释中的自定义错误消息

java - Android 限制用户输入

java - 如何通过 Spring Boot 和 Angular 9 下载 xls 文件

hibernate - 如何在多项目 Maven 中配置 Log4j

java - 自定义注解

java - 使用 BeanfactoryAware 获取基于注释的 bean