Hibernate Validator,自定义ResourceBundleLocator和Spring

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

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

执行所需作业的神奇方法是LocalValidatorFactoryBean #setValidationMessageSource(MessageSource messageSource) 。

首先,合同的方法: –

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

注意:此function需要类路径上的Hibernate Validator 4.1或更高版本。 但是,您可以使用不同的validation提供程序,但在配置期间必须可以访问Hibernate Validator的ResourceBundleMessageInterpolator类。

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

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

我-beans.xml文件

        META-INF/validation_errors    

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> violations = validator.validate(person); for(ConstraintViolation violation : violations) { System.out.println("Custom Message:- " + violation.getMessage()); } } } 

Outupt: Custom Message:- MyNotNullMessage

如果要混合现有的hibernatevalidation消息和自定义validation消息,这是一个解决方案:

         

(请参阅Web MVC框架validation部分和Spring文档中的配置Beanvalidation提供程序 )

谢谢@ 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文件。