【问题标题】:Bean Validation Message with dynamic parameter带有动态参数的 Bean 验证消息
【发布时间】:2014-02-24 12:13:07
【问题描述】:

我开始使用 bean 验证,我正在尝试编写一个约束。我的限制是验证 CPF(巴西的个人文件)。我的约束有效,但我需要消息包含动态参数。

我正在使用 ValidationMessages.properties。我的代码:

@Constraint(validatedBy=CpfValidator.class)
@Size(min=11, max=14)
@Documented
@Target({ElementType.FIELD,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Cpf {

    String message() default "{cpf.validation.message}";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};

}

我的 ValidationMessages.properties:

cpf.validation.message=Cpf {cpf} é inválido

我的验证器:我正在使用 context.buildConstraintViolationWithTemplate 来自定义我的消息。

@Override
public boolean isValid(String value, ConstraintValidatorContext context) {

    String cpf = value;

    boolean result = ValidationUtil.validaCpf(cpf);
    if (result) {
        return true;
    }

    context.disableDefaultConstraintViolation();
    context.buildConstraintViolationWithTemplate("pf.validation.message}")
           .addConstraintViolation();
    return false;

}

创建消息时如何通过参数传递验证值(cpf)?

【问题讨论】:

    标签: validation jakarta-ee message bean-validation


    【解决方案1】:

    如果我们想为消息提供其他参数而不是验证值:

    cpf.validation.message=Cpf {cpf} é inválido 
    

    我们可以使用 HibernateConstraintValidatorContext 如下:

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
    
        String cpf = value;
    
        boolean result = ValidationUtil.validaCpf(cpf);
        if (result) {
            return true;
        }
    
        HibernateConstraintValidatorContext hibernateContext = context.unwrap(HibernateConstraintValidatorContext.class);
        hibernateContext.disableDefaultConstraintViolation();
        hibernateContext
               .addMessageParameter( "cpf", cpf )
               .buildConstraintViolationWithTemplate("pf.validation.message}")
               .addConstraintViolation();
    
        return false;
    
    }
    

    如上所述,是在休眠documentation

    【讨论】:

      【解决方案2】:

      我找到了解决方案,我认为我可以改进该解决方案,但现在还不错。我在我的代码中做了这些更改:

      String message() default "Cpf %s é inválido";
      
      String msgDefault = context.getDefaultConstraintMessageTemplate();
      String msgFormatada = String.format(msgDefault, cpf);
      
      context.disableDefaultConstraintViolation();
      context.buildConstraintViolationWithTemplate(msgFormatada).addConstraintViolation();
      

      【讨论】:

        【解决方案3】:

        使用 Hibernate Validator >= 4.2 时,您可以在消息中通过 ${validatedValue} 引用已验证的值(在规范中标准化的 Bean Validation 1.1 中):

        cpf.validation.message=Cpf ${validatedValue} é inválido
        

        顺便说一句。 Hibernate Validator 已经带有@CPF 约束,您可以在reference guide 中找到更多信息。很高兴听到这对您有用。

        【讨论】:

        • 感谢 Gunnar 的帮助,但我不能使用非 JPA 规范的注解。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-25
        • 1970-01-01
        • 1970-01-01
        • 2011-12-24
        • 1970-01-01
        • 2011-05-11
        相关资源
        最近更新 更多