0

Я написал пользовательские Hibernate проверки ограничений для класса Money:Hibernate Validator + Spring: неправильное сообщение об ошибке проверки

@Target({METHOD, FIELD, ANNOTATION_TYPE}) 
@Retention(RUNTIME) 
@Constraint(validatedBy = MoneyLimitedValidator.class) 
@Documented 
public @interface MoneyLimited { 
    String message() default "{error.validation.money.limited}"; 
    Class<?>[] groups() default {}; 
    Class<? extends Payload>[] payload() default {}; 
} 

Это работает отлично, за исключением сообщений об ошибках. Я вижу очень странное поведение: расслоение ресурсов нашли и сообщение разрешаться имя, но завернутые в специальные символы, которые, как правило, появляется, если сообщение не может быть решена по имени:

??Incorrect sum value._en_EN?? 

Здесь Incorrect sum value. является правильное сообщение, которое принято по имени error.validation.money.limited. Изначально мое сообщение выглядит так:

error.validation.money.limited = Incorrect sum value. 

Я попытался удалить {} скобки от имени сообщения в MoneyLimited#message(), но ничего не меняется (даже более странно).

я указал мои проверки сообщений свертка, как описано in this answer:

<annotation-driven validator="validator" /> 
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> 
    <property name="validationMessageSource" ref="messageSource"/> 
</bean> 

Таким образом, вопрос: как исправить сообщение?

Я использую Spring Framework 3.2.4.RELEASE и Hibernate Validator 4.3.1.Final.

+0

http://stackoverflow.com/questions/5550065/hibernate-validation-and-localized-error-messages?rq=1 может помочь? Или вы можете поставить точку останова [здесь] (http://grepcode.com/file/repo1.maven.org/maven2/org.hibernate/hibernate-validator/4.3.1.Final/org/hibernate/validator/messageinterpolation/ResourceBundleMessageInterpolator .java # ResourceBundleMessageInterpolator) –

+0

Нет, это не помогает, потому что это на самом деле то же самое. Посмотрите на этот ответ: http://stackoverflow.com/questions/11225023/messageinterpolator-in-spring#11226683 –

+0

(я просто размышляю): кажется, что messageresolver пытается решить проблему с ошибкой дважды: первый раз с успехом, после добавления локали (или стандартная локаль) и неприемлемо (причина?) (может быть, проблема с локализацией) –

ответ

0

Я нашел причину двойного разрешения. Я не упоминал ранее, что я использую Thymeleaf в качестве шаблона двигателя (который использует SpringEL). Есть полезный фрагмент кода в примере приложения, которые я просто скопировать-вставить (позор мне) и забыл о:

<div class="errors" th:if="${#fields.hasErrors('*')}" th:fragment="validationErrorTpl"> 
    <ul> 
     <li th:each="err : ${#fields.errors('*')}" th:text="#{${err}}">Input is incorrect</li> 
    </ul> 
</div> 

Как вы можете видеть ${err} переменная заключена в #{}, которая на самом деле разрешающую сообщение от расслоения. Таким образом, с привязками к ограничению проверки, сообщение было разрешено дважды: на уровне аннотации и в шаблоне вида.

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