2013-06-04 4 views
2

Как я могу возвращать разные сообщения на валидаторе уровня?Проверка Java bean - переопределить сообщение по умолчанию

Интерфейс

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. 

ответ

9

Вам нужно для использования ConstraintValidatorContext для выбора правильного шаблона сообщения. Вы можете увидеть пример в документах валидатора Hibernate - 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

ли вы знаете, если это возможно, чтобы добавить атрибут сообщение для форматирования во время выполнения ('«{0}»')? Кажется, что в определении интерфейса могут использоваться только жестко заданные атрибуты, и они не могут быть обновлены. – djmj

+0

В проверке Bean 1.0 допускались только статические переменные. Hibernate Validator также позволяет интерполировать само проверенное значение. Это также привело к обновлению спецификации компонента Bean Validation 1.1. Однако это не позволяет добавлять какие-либо динамические переменные. В ближайшее время мы можем реализовать что-то подобное в Hibernate Validator - https://hibernate.atlassian.net/browse/HV-701. Не стесняйтесь оставлять комментарий по этой проблеме, чтобы описать вашу учетную запись. – Hardy

+0

Во многих ограничениях на уровне класса эта функция полезна, поскольку проверка может зависеть от динамических свойств. Еще одна учетная запись - простая проверка учетных данных. Например, 'Заказ в состоянии {0} не может быть обновлен клиентом типа {1}. В этом случае тип также должен быть передан экземпляру проверки как-то, если он не является свойством самого заказа, что кажется плохим обходным путем. Поэтому я должен проверить этот случай вручную, чтобы создать правильное сообщение или использовать общее сообщение. 'Недействительные учетные данные для обновления порядка в текущем состоянии.'. – djmj

Смежные вопросы