2012-02-19 50 views
0

我使用的是Spring 3.1,並具有以下彈簧配置,我使用我自己的ValidationMessageSource明確創建了LocalValidatorFactoryBean。我的課堂路徑中有Hibernate Validator 4.1。如何阻止DefaultListableBeanFactory隱式創建LocalValidatorFactoryBean實例

<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我在春季配置引起的。 任何指針仍然會幫助

回答

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