2014-01-31 4 views
3

Я начинаю с проверки бина, и я пытаюсь создать ограничение. Мое ограничение заключается в проверке 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 

Моего Validator: я использую context.buildConstraintViolationWithTemplate для customiza моего сообщения.

@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

При работе с Hibernate Validator> = 4,2 вы можете ссылаться на проверенную значение с помощью ${validatedValue} в ваших сообщениях (в Bean Validation 1.1, который стандартизован в спецификации):

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

Btw. Hibernate Validator уже имеет ограничение @CPF, вы можете узнать больше в reference guide. Было бы очень приятно услышать, как это работает для вас.

+1

Спасибо за помощь Гуннар, но я не могу использовать аннотации, которые не являются спецификациями JPA. –

4

Я нашел решение, я думаю, что смогу улучшить это решение, но пока это хорошо. Я вносил изменения в свой код:

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

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

context.disableDefaultConstraintViolation(); 
context.buildConstraintViolationWithTemplate(msgFormatada).addConstraintViolation(); 
Смежные вопросы