使用定制ResourceBundle与休眠验证程序
-
27-09-2019 - |
题
我想设置一个定义消息来源对于休眠验证程序4.1通过春天3.0.我已经设置了必要的配置:
<!-- JSR-303 -->
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="validationMessageSource" ref="messageSource"/>
</bean>
翻译服从我的消息来源,但似乎更换标记的信息自己看起来的消息来源,即为:
my.message=the property {prop} is invalid
有电话找了'支柱'在因为.进入 ResourceBundleMessageInterpolator.interpolateMessage
我注意到,如果是的话,为什么不试国家:
运行的信息插根据的算法中规定的JSR303.
注:看起坐在户束递归而查找违约束都没有!
这看起来我喜欢的递归总是会发生对于一个用户指定的束,因此我可不翻译的标准消息就像一个大小。
我怎么插在我自己的消息来源,并能够具有参数的被取代的消息?
解决方案
这看起来我喜欢的递归 总是会采取的地方 用户指定的束,所以在影响我 可不翻译的标准消息 就像一个大小。
休眠验证程序的ResourceBundleMessageInterpolator创建的两个实例ResourceBundleLocator(即PlatformResourceBundleLocator)一个用户定义的验证消息-userResourceBundleLocator和其他JSR-303标准的验证消息-defaultResourceBundleLocator.
任何案文中出现括号内的两个例 {someText}
在信息被视为replacementToken.ResourceBundleMessageInterpolator试图找到匹配的价值,它可取代的replacementToken在ResourceBundleLocators.
- 第一,在UserDefinedValidationMessages(其递归),
- 然后在DefaultValidationMessages(这是不是递归).
所以,如果你把一个标准的JSR-303消息在定义ResourceBundle说, validation_erros.properties
, 它将取代你的定制信息。看看这个 例 标准NotNull验证的信息'不可以null'已取代定义'MyNotNullMessage'信息。
我怎么插在我自己的消息 源和有能够参数 被替换的信息?
我的。消息=酒店{托}是 无效
经过两ResourceBundleLocators,ResourceBundleMessageInterpolator找到更多的replaceTokens在resolvedMessage(解决两捆).这些replacementToken是没什么但是 名称的注释的属性, 如果这样的replaceTokens被发现在resolvedMessage,它们所取代的 值的匹配的注释性.
ResourceBundleMessageInterpolator.java [线168,4.1.0.最后]
resolvedMessage = replaceAnnotationAttributes( resolvedMessage, annotationParameters );
提供的一个例子来取代{托}有定义的价值,我希望它会帮助你。
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.性能
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