2012-04-30 3 views
8

Во-первых, позвольте мне объяснить, что я использую Spring MVC 3.1.1 и Hibernate validation 4.2.0. Я использую аннотации проверки для различных форм в приложении Spring. Поскольку мое приложение должно быть локализовано, я использовал набор ресурсов для моих сообщений проверки, которая выглядит примерно так:Как я могу сделать Spring для разных валидационных сообщений для одного и того же валидатора класса?

# ValidationMessages.bundle 
FieldMatch=Password and confirmation must match. 

Соответствующее определение класса для этого сообщения выглядит следующим образом:

@FieldMatch.List({ 
    @FieldMatch(first = "password", second = "passwordConfirmation") 
}) 
public class RegistrationForm { 
    // ... 
} 

У меня есть этот настраиваемый набор ресурсов, созданный в моем appContext.xml, и мои сообщения отображаются в форме без каких-либо проблем.

Вот моя дилемма. Существует новое требование, что я должен подтвердить соответствие полей. Сейчас я просто подтверждаю, что совпадают два поля пароля. Теперь мое требование состоит в том, что я должен подтвердить адрес электронной почты тоже. Я знаю, что это глупое требование, но я не могу его изменить. Так что теперь определение класса будет выглядеть следующим образом:

@FieldMatch.List({ 
    @FieldMatch(first = "password", second = "passwordConfirmation") 
    @FieldMatch(first = "email", second = "emailConfirmation") 
}) 
public class RegistrationForm { 
    // ... 
} 

Очевидно, что мой текущий набор ресурсов не будет работать, потому что мне нужно два отдельных сообщения (по одному для каждого матча). Я пробовал использовать message="{emails.must.match}", а затем определял это сообщение в наборе ресурсов, но на самом деле он никогда не показывает сообщение, он просто показывает фактический текст {email.must.match}.

Итак, после всего, что объясняет, мой вопрос прост: как я могу сделать каждый из этих валидаторов FieldMatch на уровне класса, есть другое сообщение, которое определено в наборе ресурсов, чтобы его можно было локализовать?

Заранее благодарим за любую помощь!

[EDIT] Для тех, кто интересуется, this является валидатором FieldMatch, который я использую.

UPDATE 5/23/2012 Вот другие определения боба попросил:

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> 
    <property name="basenames"> 
     <list> 
      <value>ErrorBundle</value> 
      <value>ForgotPasswordBundle</value> 
      <!-- etc etc --> 
     </list> 
    </property> 
</bean> 

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

ответ

1

Случаи, подобные этому, обычно включают то, что OP не включал в вопрос. Я думаю, это потому, что если решение было простым или вызвано чем-то, что ОП думал, что это вызвано, у них не будет проблемы. Нет суждения; Я сделал это.

Поэтому я предлагаю шаги по устранению неполадок вместо полного решения, потому что, основываясь на том, что вы сказали, он должен работать.

Прежде всего, давайте проверим, что это не странная проблема интерполяции и попробуйте message="{emails-must-match}".

Если это не работает, ну, похоже, вы использовали работу ValidationMessages.properties. Я вернусь к этому (удалив <property name="validationMessageSource" ref="messageSource"/> из конфигалятора) и посмотрим, можете ли вы получить message="{emails.must.match}" для работы с emails.must.match, определенным в ValidationMessages.properties. Если это все еще не работает, вернитесь к сообщению по умолчанию, которое у вас было с помощью ключа FieldMatch, и посмотрите, получилось ли это сообщение для обоих условий ошибки.

Это поможет локализовать проблему.

+0

Это поставило меня на правильный путь. На самом деле мой пакет не назывался 'ValidationMessages.properties', а вместо этого' ValidationBundle.properties' - когда я переименовал файл, все работало, и я получил нужную строку. Ура! –

0

Что ключ сообщения в вашем комплекте ресурсов? Это должно быть «emails.must.match» (то есть без фигурных скобок, необходимых для атрибута message ограничения).

+0

Я гарантировал, что имена совпадают точно не повезло. Он просто показывает версию с фигурной скобкой. –

+1

Можете ли вы опубликовать, как настроить валидатор (контекст приложения)? Вы используете 'LocalValidatorFactoryBean'? Также где находится ваш пакет сообщений? Это называется ValidationMessages.properties? – Gunnar

1

FieldMatch использует валидатор JSR-303 (javax.validation.Validator), а не валидатор весны (org.springframework.validation.Validator). Вы конфиг источник сообщения вроде:

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

и конечно соответствующий messageSource?

+0

см. Обновления выше :) –

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