2012-06-27 12 views
5

Tôi sử dụng Spring 3.1.1 và Hibernate-validator 4.3.0.Final và có vấn đề với việc thay đổi MessageInterpolator mặc định, có thông báo xác thực từ ValidationMessages (trong classpath).MessageInterpolator trong Spring

Tôi muốn sử dụng ResourceBundleMessageInterpolator đó sẽ mất các tin nhắn từ messageSource mùa xuân của tôi

tôi đã làm một cái gì đó như thế này trong tôi ứng dụng 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> 

Và khi tôi bắt đầu ứng dụng web của tôi trong nhật ký tôi xem:

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 

Vì vậy, bạn có thể thấy, nó không phải là ResourceBundleMessageInterpolator mà tôi muốn. Đó là LocaleContextMessageInterpolator

Sau này khi tôi cố gắng để xác nhận một cái gì đó tôi chỉ nhận được tin nhắn từ ValidationMessages.properties, không phải từ nguồn tin mùa xuân:

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. 

Như bạn có thể nhìn thấy từ ứng dụng context.xml Tôi muốn sử dụng MessageSourceResourceBundleLocator , nhưng nó được sử dụng, tôi không biết tại sao PlatformResourceBundleLocator

Bất kỳ ý tưởng nào?

Trả lời

15

Bạn không cần phải khai báo ResourceBundleMessageInterpolatorMessageSourceResourceBundleLocator đậu một mình (trừ khi bạn phải), họ được tạo ra bởi LocalValidatorFactoryBean khi bạn cung cấp messageSource:

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

(Nó làm điều này dưới mui xe :)

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

Vì vậy, với định nghĩa bean đơn giản, bạn có nhận được kết quả gỡ lỗi giống nhau không? Bạn sử dụng ref "validator" ở đâu? Bạn có thể phải sử dụng <mvc:annotation-driven validator="validator"> chẳng hạn.

+4

Cảm ơn rất nhiều câu trả lời. Trước đó tôi đã sử dụng, phiên bản đơn giản hơn với setValidationMessageSource, như bạn đã viết. Hành vi này giống như tôi đã mô tả lúc đầu. Vấn đề là tôi bị mất một validator thuộc tính = "validator" trong của tôi. Tôi đã thêm thuộc tính và nó hoạt động. –

+0

phải làm gì nếu tôi chỉ sử dụng mô-đun web-web, không phải là spring-webmvc? –

+0

nơi sử dụng trình xác nhận hợp lệ trong cấu hình dựa trên chú thích – karthi

Các vấn đề liên quan