Pma*_*Pma 9 java spring hibernate-validator
我试图在hibernate验证4.1中覆盖默认的ResourceBundleLocator.到目前为止,它完美地运行,但其使用的唯一示例包括用于实例化ValidationFactory的Java代码.
当使用具有spring hibernate的web应用程序时,会自动配置验证(只应存在合适的hibernate验证*.jar文件并自动使用).如何在该场景中替换ResourceBundleLocator?我没有看到在任何属性或applicationContext.xml文件中规划我的自定义ResourceBundleLocator的方法.
dir*_*ira 18
执行所需作业的神奇方法是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)...像这样......
我-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>
Run Code Online (Sandbox Code Playgroud)
validation_errors.properties
javax.validation.constraints.NotNull.message=MyNotNullMessage
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
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());
}
}
}
Run Code Online (Sandbox Code Playgroud)
Outupt: Custom Message:- MyNotNullMessage
小智 5
如果要混合现有的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>
Run Code Online (Sandbox Code Playgroud)
(请参阅Web MVC框架验证部分和Spring文档中的配置Bean验证提供程序)
| 归档时间: |
|
| 查看次数: |
14511 次 |
| 最近记录: |