2010-11-15 41 views
9

我想覆蓋Hibernate驗證4.1中的默認ResourceBundleLocator。到目前爲止,它完美地工作,但其使用的唯一例子包括實例化ValidationFactory的Java代碼。Hibernate驗證器,自定義ResourceBundleLocator和春天

在Spring中使用web應用程序時會自動配置hibernate驗證(只有合適的hibernate validation * .jar文件應該存在並且會自動使用)。我怎樣才能在這種情況下替代ResourceBundleLocator?我沒有看到在任何屬性或applicationContext.xml文件中specyfing我的自定義ResourceBundleLocator的方法。

回答

18

完成所需工作的神奇方法是LocalValidatorFactoryBean#setValidationMessageSource(MessageSource messageSource)

首先,該法的合同: -

指定自定義春天的MessageSource解決驗證 的消息,而不是依賴於 JSR-303的默認 「ValidationMessages.properties」 捆綁 在類路徑中。這可能是指 Spring上下文的共享 「messageSource」bean,或者某些 特殊MessageSource設置僅用於 驗證目的。

注:此功能需要在 類路徑休眠 驗證4.1或更高版本。您仍然可以使用不同的驗證提供程序,但 Hibernate驗證程序的 ResourceBundleMessageInterpolator 類必須在 配置期間可訪問。

指定此屬性或 「messageInterpolator」,而不是兩者。如果 你想建立一個定製 MessageInterpolator,考慮Hibernate驗證的 ResourceBundleMessageInterpolator和 傳遞一個春天 MessageSourceResourceBundleLocator 構建你的插補時獲得 。

您可以通過調用此方法......像這樣指定您的自定義message.properties(或.xml)...

我-beans.xml文件

<bean name="validator" 
    class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> 
    <property name="validationMessageSource"> 
     <ref bean="resourceBundleLocator"/> 
    </property> 
</bean> 

<bean name="resourceBundleLocator" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 
    <property name="basenames"> 
     <list> 
      <value>META-INF/validation_errors</value> 
     </list> 
    </property> 
</bean> 

validation_errors.properties

javax.validation.constraints.NotNull.message=MyNotNullMessage 

Person.java

class Person { 
    private String firstName; 
    private String lastName; 

    @NotNull 
    public String getFirstName() { 
     return firstName; 
    } 
    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 
    public String getLastName() { 
     return lastName; 
    } 
    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 
} 

BeanValidationTest。java的

public class BeanValidationTest { 

    private static ApplicationContext applicationContext; 

    @BeforeClass 
    public static void initialize() { 
     applicationContext = new ClassPathXmlApplicationContext("classpath:META-INF/spring/webmvc-beans.xml"); 
     Assert.assertNotNull(applicationContext); 
    } 

    @Test 
    public void test() { 
     LocalValidatorFactoryBean factory = applicationContext.getBean("validator", LocalValidatorFactoryBean.class); 
     Validator validator = factory.getValidator(); 
     Person person = new Person(); 
     person.setLastName("dude"); 
     Set<ConstraintViolation<Person>> violations = validator.validate(person); 
     for(ConstraintViolation<Person> violation : violations) { 
      System.out.println("Custom Message:- " + violation.getMessage()); 
     } 
    } 

} 

Outupt:Custom Message:- MyNotNullMessage

4

這裏是一個解決方案,如果你想混在現有的Hibernate驗證消息和自定義驗證消息:

<mvc:annotation-driven validator="validator" /> 
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> 
    <property name="validationMessageSource" ref="messageSource"/> 
</bean> 
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> 
    <property name="basenames" value="i18n,iso-i18n,org.hibernate.validator.ValidationMessages" /> 
    <property name="useCodeAsDefaultMessage" value="true" /> 
</bean> 

(見Web MVC framework Validation sectionConfiguring a Bean Validation Provider在Spring文檔)

+0

在哪裏使用驗證器基於註釋的配置中的bean(不含XML的完整Java配置)。 – karthi 2017-06-28 07:32:29