我正在尝试在Hibernate验证4.1中覆盖默认的ResourceBundlelocator。到目前为止,它的运作良好,但是其用法的唯一示例包括Java代码实例化验证范围。

当将Web应用程序与Spring Hibernate验证一起自动配置时(仅适当的Hibernate验证 *.jar文件应存在,并且自动使用)。在这种情况下,我如何替换资源键盘子?我看不到在任何属性或applicationContext.xml文件中指定自定义资源Bundlelocator的任何方法。

有帮助吗?

解决方案

所需工作的神奇方法是 localValidatorFactoryBean#setValidationMessagesource(MessagsOurce Messagsource).

首先,该方法的合同: -

指定用于解决验证消息的自定义Spring MessageRece,而不是依赖JSR-303的默认“验证” buncles。这可能是指春季上下文共享的“ Messageource” BEAN,或仅用于验证目的的某些特殊MessageReceRce设置。

注意:此功能需要在类路径上进行休眠验证器4.1或更高版本。但是,您可能会使用其他验证提供商,但是在配置过程中必须可以访问Hibernate验证器的ResourceBundlemessageInterPolator类。

指定此属性或“ MessageInterPolator”,而不是两者兼而有之。如果您想构建自定义MessageInterPolator,请考虑从Hibernate验证器的ResourceBundleMessageInterpolator派生,然后在构造插补器时传递Spring MessageRecerEsourCeresourceBundleLecundlecator。

您可以通过调用此方法来指定您的自定义消息。

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>

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

}

淘汰: Custom Message:- MyNotNullMessage

其他提示

如果要混合现有的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框架验证部分配置豆验证提供商 在春季文档中)

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

我只是转换为配置类,在这里发布,以防其他人需要:

导入详细信息:它对我使用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文件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top