我想设置一个定义消息来源对于休眠验证程序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.

  1. 第一,在UserDefinedValidationMessages(其递归),
  2. 然后在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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top