如何阻止DefaultListableBeanFactory隐式创建LocalValidatorFactoryBean实例

时间:2012-02-19 11:10:00

标签: java spring bean-validation

我正在使用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引起的。 任何指针仍然有帮助

1 个答案:

答案 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"/>