java - Hibernate Validator、自定义 ResourceBundleLocator 和 Spring

标签 java spring hibernate-validator

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

当使用带有 spring hibernate validation 的 web 应用程序时,自动配置(只有合适的 hibernate validation *.jar 文件应该存在并自动使用)。在那种情况下我如何替换 ResourceBundleLocator?我没有在任何属性或 applicationContext.xml 文件中看到任何指定我的自定义 ResourceBundleLocator 的方法。

最佳答案

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

首先,方法的契约:-

Specify a custom Spring MessageSource for resolving validation messages, instead of relying on JSR-303's default "ValidationMessages.properties" bundle in the classpath. This may refer to a Spring context's shared "messageSource" bean, or to some special MessageSource setup for validation purposes only.

注意:此功能需要 Hibernate Validator 4.1 或更高版本 类路径。你仍然可以使用 不同的验证提供者,但 Hibernate validator 的 ResourceBundleMessageInterpolator 类(class)期间必须可以访问 配置。

指定此属性或 “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

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

}

输出: 自定义消息:- MyNotNullMessage

关于java - Hibernate Validator、自定义 ResourceBundleLocator 和 Spring,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4186556/

相关文章:

java - 如何注册自定义约束 validator

java - CSRFTester 不生成 html 文件

java - 如何使用 Maven 在 WAR、WEB-INF/lib 目录中包含特定的 jar

java - 何时通知 ReferenceHandler 线程?

spring - UI.getCurrent 在 Spring Managed Bean 中返回 Null

javax.validation.ValidationException : Unable to find a default provider - 10

java - 使用 Weld 和 Hibernate Validator 进行方法验证

java - 如何关闭嵌入式 Jetty(Eclipse 项目)?

java - Spring Boot Jar 文件通过终端使用 nohup 启动

java - 为什么在将 Hibernate 5.2.8 与 JasperReports 6.4.0 一起使用时出现 java.lang.NoSuchMethodError