带有动态参数的Bean验证消息

时间:2014-01-31 17:21:29

标签: validation java-ee message bean-validation

我开始使用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)?

3 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:5)

我找到了解决方案,我想我可以改进这个解决方案,但现在它很好。我在代码中做了这些更改:

String message() default "Cpf %s é inválido";

String msgDefault = context.getDefaultConstraintMessageTemplate();
String msgFormatada = String.format(msgDefault, cpf);

context.disableDefaultConstraintViolation();
context.buildConstraintViolationWithTemplate(msgFormatada).addConstraintViolation();

答案 2 :(得分: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