我正在使用Spring 3.1并使用以下spring配置,我使用自己的LocalValidatorFactoryBean
显式创建ValidationMessageSource
。我的类路径中有Hibernate Validator 4.1。
<bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>ValidatorMsgID</value>
</list>
</property>
</bean>
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="validationMessageSource" ref="messageSource"/>
</bean>
<bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor"/>
但是我注意到,通过在类LocalValidatorFactoryBean
方法中调试调试来创建afterPropertiesSet
两次。第一次是我在spring配置中定义的explicite bean,但是在DefaultListableBeanFactory
类后再次隐式地实例化同一个类 - 显然这次没有validationMessageSource
。因此,当Spring确实使用LocalValidatorFactoryBean
时,使用默认的Hibernates messagesource
,而不是我指定的那个。
好的,进一步研究一下,这似乎是由mvc:annotation-driven
引起的。
任何指针仍然有帮助
答案 0 :(得分:5)
好的,我最终通过将验证器属性添加到“mvc:annotation-driven”来对其进行排序。这是我的最终春季配置看起来
<bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>com.mycompany.msgs.ValidatorMsgID</value>
</list>
</property>
</bean>
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="messageInterpolator">
<bean 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>
</property>
</bean>
<bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor">
<property name="validator" ref="validator"/>
</bean>
<mvc:annotation-driven validator="validator"/>