Hibernate Validator,自定义ResourceBundleLocator和Spring

时间:2010-11-15 16:32:23

标签: java spring hibernate-validator

我正在尝试在hibernate验证4.1中覆盖默认的ResourceBundleLocator。到目前为止,它完美地运行,但其使用的唯一示例包括用于实例化ValidationFactory的java代码。

当使用具有spring hibernate的web应用程序时,会自动配置验证(只应存在合适的hibernate验证* .jar文件并自动使用)。如何在该场景中替换ResourceBundleLocator?我没有看到在任何属性或applicationContext.xml文件中规划我的自定义ResourceBundleLocator的方法。

3 个答案:

答案 0 :(得分:18)

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

首先,方法的合同: -

  
    

指定用于解析验证的自定义Spring MessageSource     消息,而不是依赖     JSR-303的默认值     “ValidationMessages.properties”包     在类路径中。这可以参考a     Spring上下文共享     “messageSource”bean,或者一些     特殊的MessageSource设置     仅用于验证目的。

  
     

注意:此功能需要Hibernate   Validator 4.1或更高版本   类路径。你可以使用一个   不同的验证提供商   Hibernate Validator的   ResourceBundleMessageInterpolator   在上课期间必须可以上课   配置。

     

指定此属性或   “messageInterpolator”,而不是两者。如果   你想建立一个自定义   MessageInterpolator,考虑派生   来自Hibernate Validator的   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

答案 1 :(得分:5)

如果您想混合现有的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>

(请参阅Spring文档中的Web MVC framework Validation sectionConfiguring a Bean Validation Provider

答案 2 :(得分:0)

谢谢@ Lu55,根据您的回答,我解决了我的问题!

我刚刚转换为Configuration类,我在这里发布以防万一其他人需要:

导入详细信息:它与ReloadableResourceBundleMessageSource一起使用对我有用,但在ResourceBundleMessageSource上却不起作用。我不确定为什么。

@Configuration
public class ErrorConfig {

    @Bean
    public Validator validatorFactory (MessageSource messageSource) {
        LocalValidatorFactoryBean validator =  new LocalValidatorFactoryBean();
        validator.setValidationMessageSource(messageSource);
        return validator;
    }

    @Bean
    public MessageSource messageSource() {
        ReloadableResourceBundleMessageSource bean = new ReloadableResourceBundleMessageSource();
        bean.addBasenames("classpath:org.hibernate.validator.ValidationMessages","classpath:message");
        bean.setDefaultEncoding("UTF-8");
        return bean;
    }
}

我的资源文件夹中有message.properties文件。