小编典典

Hibernate Validator,自定义ResourceBundleLocator和Spring

java

我试图覆盖休眠验证4.1中的默认ResourceBundleLocator。到目前为止,它可以完美地工作,但是其用法的唯一示例包括用于实例化ValidationFactory的Java代码。

当将Web应用程序与spring一起使用时,hibernate验证将自动进行配置(只有适当的hibernate验证*
.jar文件应存在并且会自动使用)。在那种情况下,我该如何替代ResourceBundleLocator?在任何属性或applicationContext.xml文件中,都看不到任何指定我的自定义ResourceBundleLocator的方式。


阅读 211

收藏
2020-10-20

共1个答案

小编典典

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

首先,合同的方法:

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

注意:此功能需要在类路径上使用Hibernate Validator
4.1或更高版本。不过,您可以使用其他验证提供程序,但在配置期间必须可以访问Hibernate
Validator的ResourceBundleMessageInterpolator类。

指定此属性或“
messageInterpolator”,不能两者都指定。如果您想构建一个自定义的MessageInterpolator,在构造内插器时,请考虑从Hibernate
Validator的ResourceBundleMessageInterpolator派生并传入Spring
MessageSourceResourceBundleLocator。

您可以通过调用此方法来指定自定义message.properties(或.xml)…像这样…

my-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

人.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());
        }
    }

}

输出: Custom Message:- MyNotNullMessage

2020-10-20