【问题标题】:Java bean validation - override default messageJava bean 验证 - 覆盖默认消息
【发布时间】:2013-06-04 23:28:12
【问题描述】:

如何在类级别验证器上返回不同的消息?

界面

public @interface ValidFoo
{
    public String message() default "{package.ValidFoo.message}";
}

实施

@Override
public boolean isValid(final Foo foo, final ConstraintValidatorContext context)
{
    // check constraint 1
    // --> return message "package.ValidFoo.message_constraint1"

    // check constraint 2
    // --> return message "package.ValidFoo.message_constraint2"
}

ValidationMessages.properties

package.ValidFoo.message=Validation error.
package.ValidFoo.message_constraint1=Validation error 1.
package.ValidFoo.message_constraint2=Validation error 2.

【问题讨论】:

    标签: java bean-validation


    【解决方案1】:

    您需要使用ConstraintValidatorContext 来选择正确的消息模板。您可以在 Hibernate Validator 文档中查看示例 - http://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#validator-customconstraints-validator

    实际上你做了这样的事情:

        constraintContext.disableDefaultConstraintViolation();
        constraintContext.buildConstraintViolationWithTemplate(
                "{package.ValidFoo.message_constraint1}" 
        )
        .addConstraintViolation();
    

    【讨论】:

    • 您是否还知道是否可以在运行时添加用于格式化的消息属性("{0}")?似乎只能使用接口定义中的硬编码属性,并且无法更新。
    • 在 Bean Validation 1.0 中只允许使用静态变量。 Hibernate Validator 还允许对验证值本身进行插值。这也使它成为 Bean Validation 1.1 规范更新。但是,这不允许添加任何动态变量。我们可能很快会在 Hibernate Validator 中实现类似的功能 - hibernate.atlassian.net/browse/HV-701。随时就该问题发表评论以描述您的用例。
    • 在许多类级约束中,此功能很有帮助,因为验证可以依赖于动态属性。另一个用例是简单的凭证检查。例如Order in state {0} cannot be updated by client of type {1}. 在这种情况下,类型也必须以某种方式传递给验证器实例,除非它是 Order 本身的属性,这似乎是一个不好的解决方法。所以我必须手动验证这个案例以创建正确的消息或使用通用消息。 Invalid credentials to update Order in current state..
    猜你喜欢
    • 2020-01-17
    • 2014-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-13
    相关资源
    最近更新 更多