2012-06-27 20 views
5

Spring 3.1.1 ve Hibernate-validator 4.3.0.Final'i kullanıyorum ve doğrulama mesajlarını ValidationMessages'dan (sınıf yolunda) alan varsayılan MessageInterpolator'ı değiştirmeyle ilgili bir sorun yaşıyorum.Baharda MessageInterpolator

benim bahar messageSource gelen mesajları alacak olan ResourceBundleMessageInterpolator kullanmak istiyorum

benim uygulama context.xml böyle bir şey yaptı:

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

Ve günlüklerinde benim web uygulaması başlattığınızda ben bkz:

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 

Yani gördüğünüz gibi, bu istediğim ResourceBundleMessageInterpolator değil.

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. 

uygulama-context.xml görebileceğiniz gibi ben kullanım MessageSourceResourceBundleLocator istiyorum: Ben sadece bahar mesajı kaynağından, ValidationMessages.properties gelen mesajları değil almak şey doğrulamaya çalıştığınızda O

Sonra LocaleContextMessageInterpolator var ama kullanıldı, neden bilmiyorum PlatformResourceBundleLocator

Herhangi bir fikir var mı?

cevap

15

kendiniz ResourceBundleMessageInterpolator ve MessageSourceResourceBundleLocator fasulye beyan etmek zorunda değilsiniz messageSource kaynağı, onlar LocalValidatorFactoryBean tarafından oluşturulur (Mecbur kalmadıkça):

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

(Bu başlık altında yapar :)

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

Basitleştirilmiş fasulye tanımlamasıyla aynı hata ayıklama çıktısı alıyor musunuz? "Validator" ref'yi nerede kullanıyorsunuz? Örneğin, <mvc:annotation-driven validator="validator">'u kullanmanız gerekebilir.

+4

Cevabınız için çok teşekkürler. Daha önce, yazdığınız gibi setValidationMessageSource ile daha basit bir sürüm kullandım. Davranış, ilk başta tarif ettiğimyle aynıydı. Sorun şu ki, kodumda bir validator = "validator" özniteliğini kaçırdım. Özniteliği ekledim ve çalışıyor. –

+0

Sadece spring-web modülünü kullanırsam, spring-webmvc'i kullanmazsam ne yapmalıyım? –

+0

Açıklama eki konfigürasyonunda validator ref'in nerede kullanılacağı – karthi