完成所需工作的神奇方法是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)......就像这样......
我的豆类.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