2012-06-27 9 views
5

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

<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アプリケーションを起動します。

私は自分のアプリケーションのcontext.xmlにこのような何かをした私の春のmessageSource

からのメッセージを取るであろうResourceBundleMessageInterpolatorを使用したいです

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ではありません。あなたは、私がMessageSourceResourceBundleLocatorを使用したいアプリケーションのcontext.xmlから見ることができるように

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. 

:私はちょうどValidationMessages.propertiesからではなく、春のメッセージソースからメッセージを取得し、何かを検証しようとすると、それは

その後LocaleContextMessageInterpolator

です、それが使用されて、私は理由を知らないPlatformResourceBundleLocator

アイデア?

答えて

15

あなたがmessageSourceを供給するときは、(あなたがする必要がある場合を除き)自分でResourceBundleMessageInterpolatorMessageSourceResourceBundleLocator豆を宣言する必要はありません、彼らはLocalValidatorFactoryBeanによって作成されます。

<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定義では、同じデバッグ出力が得られますか? "validator" refをどこで使いますか?たとえば、<mvc:annotation-driven validator="validator">を使用する必要があります。

+4

お返事ありがとうございました。以前は、あなたが書いたように、setValidationMessageSourceを使ったもっと簡単なバージョンを使っていました。その振る舞いは、最初に説明したのと同じでした。私のでは、属性バリデータ= "バリデータ"を見逃していました。私は属性を追加し、それは動作します。 –

+0

spring-webmvcではなく、spring-webモジュールのみを使用する場合はどうすればよいですか? –

+0

アノテーションベースのコンフィグレーションでバリデータ参照を使用する場所 – karthi