2012-06-27 4 views
5

Ich benutze Spring 3.1.1 und Hibernate-Validator 4.3.0.Final und habe ein Problem mit der Änderung der Standard-MessageInterpolator, die Validierung Nachrichten von ValidationMessages (in Classpath) dauert.MessageInterpolator im Frühjahr

Ich will ResourceBundleMessageInterpolator verwenden, welche Nachrichten von meiner Feder Message

Ich habe so etwas in meiner Anwendung-context.xml nehmen:

<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> 

Und wenn ich meine Web-Anwendung in Protokollen beginnen I siehe:

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 

so wie Sie sehen können, ist es nicht ResourceBundleMessageInterpolator, die ich will. Es ist LocaleContextMessageInterpolator

Später, wenn ich versuche, etwas zu bestätigen bekomme ich nur die Nachrichten von ValidationMessages.properties, nicht aus Federnachrichtenquelle:

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. 

Wie Sie aus anwendungs ​​context.xml sehen kann ich MessageSourceResourceBundleLocator will , aber es ist verwendet, ich weiß nicht warum PlatformResourceBundleLocator

Irgendwelche Ideen?

Antwort

15

Sie haben noch selbst ResourceBundleMessageInterpolator und MessageSourceResourceBundleLocator Bohnen zu erklären (es sei denn, Sie müssen), werden sie von LocalValidatorFactoryBean erstellt, wenn Sie messageSource liefern:

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

(Er tut dies unter der Haube :)

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)); 
    } 
} 

Also mit vereinfachter Bean-Definition, erhalten Sie die gleiche Debug-Ausgabe? Wo benutzt du "Validator" ref? Möglicherweise müssen Sie zum Beispiel <mvc:annotation-driven validator="validator"> verwenden.

+4

Vielen Dank für die Antwort. Früher habe ich eine einfachere Version mit setValidationMessageSource verwendet, wie Sie geschrieben haben. Das Verhalten war das gleiche wie ich es zuerst beschrieben habe. Die Sache ist, dass ich in meinem ein Attribut validator = "validator" verpasst habe. Ich habe das Attribut hinzugefügt und es funktioniert. –

+0

was tun, wenn ich nur spring-web modul, nicht spring-webmvc verwende? –

+0

Wo Validator ref in Annotation-basierte Konfiguration verwenden – karthi