5

Spring 3.1.1 と Hibernate-validator 4.3.0.Final を使用していますが、(クラスパス内の) ValidationMessages から検証メッセージを取得するデフォルトの MessageInterpolator の変更に問題があります。

Spring messageSource からメッセージを取得する ResourceBundleMessageInterpolator を使用したい

application-context.xml で次のようなことを行いました。

<bean id="resourceBundleMessageInterpolator"
      class="org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator">
    <constructor-arg index="0">
        <bean class="org.springframework.validation.beanvalidation.MessageSourceResourceBundleLocator">
            <constructor-arg index="0" ref="messageSource"/>
        </bean>
    </constructor-arg>
</bean>
<bean id="validator"
      class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
    <property name="messageInterpolator" ref="resourceBundleMessageInterpolator"/>
</bean>

ログで Web アプリケーションを起動すると、次のように表示されます。

11:04:07,402 DEBUG [org.hibernate.validator.internal.engine.ConfigurationImpl] - 
Setting custom MessageInterpolator of type
 org.springframework.validation.beanvalidation.LocaleContextMessageInterpolator 
11:04:07,402 DEBUG [org.hibernate.validator.internal.engine.ConfigurationImpl] - 
Setting custom ConstraintValidatorFactory of type org.springframework .validation.beanvalidation.SpringConstraintValidatorFactory

ご覧のとおり、私が欲しいのは ResourceBundleMessageInterpolator ではありません。LocaleContextMessageInterpolator です

後で何かを検証しようとすると、Spring メッセージ ソースからではなく、ValidationMessages.properties からメッセージを取得するだけです。

11:08:09,397 DEBUG [org.hibernate.validator.resourceloading.PlatformResourceBundleLocator] - 
ValidationMessages not found.
11:08:09,413 DEBUG [org.hibernate.validator.resourceloading.PlatformResourceBundleLocator] - 
org.hibernate.validator.ValidationMessages found.

application-context.xml からわかるように、MessageSourceResourceBundleLocator を使用したいのですが、使用されているため、PlatformResourceBundleLocator の理由がわかりません

何か案は?

4

1 に答える 1

15

ResourceBundleMessageInterpolator自分でMessageSourceResourceBundleLocatorBeanを宣言する必要はありません(必要なLocalValidatorFactoryBean場合を除く) messageSource

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

(これはボンネットの下で行われます:)

public void setValidationMessageSource(MessageSource messageSource) {
    this.messageInterpolator = HibernateValidatorDelegate.buildMessageInterpolator(messageSource);
}

// (...)


private static class HibernateValidatorDelegate {

    public static MessageInterpolator buildMessageInterpolator(MessageSource messageSource) {
        return new ResourceBundleMessageInterpolator(new MessageSourceResourceBundleLocator(messageSource));
    }
}

単純化された Bean 定義で、同じデバッグ出力が得られますか? 「バリデーター」参照はどこで使用しますか? <mvc:annotation-driven validator="validator">たとえば、使用する必要がある場合があります。

于 2012-06-27T12:54:30.950 に答える