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

Validation 带有动态参数的Bean验证消息,validation,jakarta-ee,message,bean-validation,Validation,Jakarta Ee,Message,Bean Validation,我正在开始进行bean验证,并试图构建一个约束。我的限制是验证CPF(巴西的个人文档)。我的约束正在工作,但我需要消息包含一个动态参数 我正在使用ValidationMessages.properties。我的代码: @Constraint(validatedBy=CpfValidator.class) @Size(min=11, max=14) @Documented @Target({ElementType.FIELD,ElementType.METHOD}) @Retention(Rete

我正在开始进行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 {};

}
我的验证器:我正在使用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)?

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


顺便说一句,Hibernate验证器已经带有
@CPF
约束,您可以在中找到更多信息。我很高兴听到您的建议。

我找到了解决方案,我认为我可以改进该解决方案,但目前它还不错。我在代码中做了以下更改:

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

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

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

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

cpf.validation.message=Cpf {cpf} é inválido 
我们可以使用HibernateContrantValidatorContext,如下所示:

@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;

}

正如上面提到的,是在hibernate中

感谢Gunnar的帮助,但我不能使用非JPA规范的注释。
cpf.validation.message=Cpf {cpf} é inválido 
@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;

}