我使用的是 Spring 3.1,并具有以下 spring 配置,其中我使用自己的 ValidationMessageSource
显式创建 LocalValidatorFactoryBean
。我的类路径中有 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"/>
但是我注意到,通过在类 afterPropertiesSet
方法中进行调试,LocalValidatorFactoryBean
被创建了两次。第一次是针对我在 spring 配置中定义的显式 bean,但是随后由 DefaultListableBeanFactory
类再次隐式实例化同一个类 - 显然这次没有 validationMessageSource
。因此,当 Spring 确实使用 LocalValidatorFactoryBean
时,它似乎使用的是带有默认 Hibernate messagesource
的那个,而不是我指定的那个。
好吧,进一步研究一下,这似乎是由我在 spring 配置中的 mvc:annotation-driven
引起的。
任何指针仍然会有帮助
最佳答案
好吧,我最终通过将 validator 属性添加到“mvc:annotation-driven”来对其进行排序。这就是我最终的 spring 配置的样子
<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"/>
关于java - 如何阻止 DefaultListableBeanFactory 隐式创建 LocalValidatorFactoryBean 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9348648/