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

标签 java spring bean-validation

我使用的是 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/

相关文章:

java - EasyMock断言异常被线程吞没

java - 为 Spring 方法编写 JUnit 测试用例时出现问题

java - 有没有办法将 JSR303 注释添加到 cxf 生成的类中?

java - 在部署时从 javax.validation 库获取 NoSuchMethodError

java - 无法解析 Hibernate validator 消息

java - Spring boot 返回 400 缺少构造函数,没有堆栈跟踪

spring - 如何在 Spring Boot 测试中指定 text/plain;charset=UTF-8 的媒体类型

java - JSR 303 : Is it possible to validate whole graph automatically?

java - JComboBox getSelectedIndex 不工作两次?

java - IntelliJ 代码覆盖 Java 8 - 需要 ASM 5