当前位置: 首页 > 面试题库 >

Hibernate Validator,自定义ResourceBundleLocator和Spring

冯开诚
2023-03-14
问题内容

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

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


问题答案:

完成所需工作的魔术方法是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



 类似资料:
  • 问题内容: 我试图将其他数据保存在de用户主体对象中。 我所做的是: 在我现有的用户类中实现“ UserDetails”界面,我的其他数据(例如电子邮件地址等)保存在该类中。 然后,我创建了一个UserDetailsS​​ervice实现: 最后一步是在“安全性”配置中添加UserDetailsS​​ervice。 我在控制台中看到“ loadUserByName”被调用了两次(由于“ Found

  • 6.13.2 自定义 ItemWriter 示例 自定义实现 ItemWriter 和上一小节所讲的 ItemReader 有很多方面是类似, 但也有足够多的不同之处。 但增加可重启特性在本质上是一样的, 所以本节的示例就不再讨论这一点。和 ItemReader 示例一样, 为了简单我们使用的参数也是 List: public class CustomItemWriter<T> implement

  • 6.13.1 自定义 ItemReader 示例 为了实现这个目的,我们实现一个简单的 ItemReader, 从给定的list中读取数据。 我们将实现最基本的 ItemReader 功能, read: public class CustomItemReader<T> implements ItemReader<T>{ List<T> items; public CustomIte

  • 在我向Maven添加了HATEOAS的依赖项之后,Spring Boot不会启动: 添加得依赖项: unsatisfiedDependencyException:创建名为“Security Config”的bean时出错:通过方法“Set ContentNegotationStrategy”参数0表示的不满足依赖项;嵌套异常为org.springframework.beans.factory.un

  • 问题内容: 大家好! 我有这样的电话: 是否可以将其包装在自定义函数中 但 保留回调? 就像是: 将是这样的: 问题答案: 编辑: 最近对此表示赞同,我不得不说我不再这样做。返回a,因此您可以直接使用promise以更一致和更可靠的方式执行我在这里所做的几乎所有工作。 然后用法如下: 当然,我一直都这样做。您可以在实际的成功Callack中执行回调,也可以将回调分配为成功回调: 用法如下所示:

  • 是否可以使用用户扩展在Selenium IDE中创建自定义命令.js并使其能够将自身更改为自定义导出格式,如果是这样,如何? 我将使用SeleniumIDE记录测试,这些测试将以完全自定义的Java格式导出,作为全自动测试系统的一部分运行。格式不是JUnit,而是每个测试都是它自己的类,并根据整个系统的输入动态加载。 我想要做的是在Selenium IDE中创建一个名为“take snapshot