这在我看来就像递归
将永远发生
用户指定的捆绑包,所以实际上我
无法翻译标准消息
就像尺寸一样。
Hibernate Validator 的 ResourceBundleMessageInterpolator 创建两个 ResourceBundleLocator 实例(即 PlatformResourceBundleLocator),一个用于 UserDefined 验证消息 - userResourceBundleLocator,另一个用于 JSR-303 标准验证消息 - defaultResourceBundleLocator。
出现在两个大括号内的任何文本,例如消息中的{someText} 被视为replacementToken。 ResourceBundleMessageInterpolator 尝试在 ResourceBundleLocators 中寻找可以替换replacementToken 的匹配值。
- 首先在 UserDefinedValidationMessages(递归)中,
- 然后在 DefaultValidationMessages(非递归)中。
因此,如果您将标准 JSR-303 消息放入自定义 ResourceBundle 中,例如 validation_erros.properties,它将被您的自定义消息替换。请参阅此 EXAMPLE 标准 NotNull 验证消息“可能不是 null”已被自定义“MyNotNullMessage”消息替换。
如何插入自己的消息
来源并能够有参数
在消息中被替换?
my.message=属性 {prop} 是
无效
经过两个 ResourceBundleLocators 后,ResourceBundleMessageInterpolator 在resolvedMessage 中找到更多replaceTokens(由两个bundle 解析)。这些replacementToken只不过是Annotation的属性名称,如果在resolvedMessage中找到这样的replaceToken,它们将被匹配的Annotation属性的值替换。
ResourceBundleMessageInterpolator.java [第 168 行,4.1.0.Final]
resolvedMessage = replaceAnnotationAttributes( resolvedMessage, annotationParameters );
提供一个用自定义值替换{prop}的例子,希望对你有所帮助....
MyNotNull.java
@Constraint(validatedBy = {MyNotNullValidator.class})
public @interface MyNotNull {
String propertyName(); //Annotation Attribute Name
String message() default "{myNotNull}";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default {};
}
MyNotNullValidator.java
public class MyNotNullValidator implements ConstraintValidator<MyNotNull, Object> {
public void initialize(MyNotNull parameters) {
}
public boolean isValid(Object object, ConstraintValidatorContext constraintValidatorContext) {
return object != null;
}
}
User.java
class User {
private String userName;
/* whatever name you provide as propertyName will replace {propertyName} in resource bundle */
// Annotation Attribute Value
@MyNotNull(propertyName="userName")
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
validation_errors.properties
notNull={propertyName} cannot be null
测试
public void test() {
LocalValidatorFactoryBean factory = applicationContext.getBean("validator", LocalValidatorFactoryBean.class);
Validator validator = factory.getValidator();
User user = new User("James", "Bond");
user.setUserName(null);
Set<ConstraintViolation<User>> violations = validator.validate(user);
for(ConstraintViolation<User> violation : violations) {
System.out.println("Custom Message:- " + violation.getMessage());
}
}
输出
Custom Message:- userName cannot be null