Как я могу заставить Spring показывать разные сообщения на основе пакета проверки для одного и того же валидатора в классе?

Во-первых, позвольте мне объяснить, что я использую Spring MVC 3.1.1 и проверку Hibernate 4.2.0. Я использую аннотации проверки для различных форм в моем приложении 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] Для тех, кому интересно, это FieldMatch валидатор, который я использую.

ОБНОВЛЕНИЕ 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>

person Scott Anderson    schedule 30.04.2012    source источник


Ответы (3)


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

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

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

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

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

person Old Pro    schedule 24.05.2012
comment
Это поставило меня на правильный путь. На самом деле мой пакет был назван не ValidationMessages.properties, а ValidationBundle.properties — когда я переименовал файл, все заработало, и я получил правильную строку. Ваше здоровье! - person Scott Anderson; 25.05.2012

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

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

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

person ChrLipp    schedule 17.05.2012

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

person Gunnar    schedule 01.05.2012
comment
Я убедился, что имена точно совпадают, но не повезло. Он просто показывает версию с фигурными скобками. - person Scott Anderson; 10.05.2012
comment
Можете ли вы опубликовать, как вы настроили свой валидатор (контекст приложения)? Вы используете LocalValidatorFactoryBean? Кроме того, где находится ваш пакет сообщений? Он называется ValidationMessages.properties? - person Gunnar; 16.05.2012