BeanValidation:来自ValidationMessages.properties的消息

时间:2012-08-02 19:00:46

标签: java java-ee jboss java-ee-6 bean-validation

我在设置正确的自定义bean验证消息方面有点困难。我添加了以下约束定义并将其放在某些bean上,更好地说属性。

@Constraint(validatedBy = NobleValidator.class)
@Documented
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
public @interface Noble {
    String message() default "NOT_NOBLE";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

好了,现在我刚刚实现了自定义验证器“NobleValidator”。这一切都是直截了当的。但这是我的问题。如果我试图通过像这样运行验证来验证bean

// ... 
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
Set<ConstraintViolation<Person>> s = validator.validate(p, new Class[]{});
if (s == null || s.isEmpty()) {
     // Do some suff
} else {
     for (ConstraintViolation<Person> cv : s) {
         LOGGER.error(String.format("Constraint violation: %s", cv.getMessage()));
     }
}
// ...

好的验证有效,但结果不符合预期。我得到“约束违规:NOT_NOBLE”。所以我猜验证器能够查找我的属性文件,所以它不能用正确的消息文本替换密钥。 ValidatorMessages.properties看起来像这样:

NOT_NOBLE = Foo Bar不高贵

规范(JSR303)说我必须将ValidationMessages.properties放到我的classpath根目录,我希望它应该是MyDeploymentUnit.war / WEB-INF / classes / ValidationMessages.properties,这就是我的应用程序的构建和部署方式。出于调试原因,我将其添加到我的自定义验证器中,以确保文件存在并正确设置

@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
InputStream is = getClass().getClassLoader().getResourceAsStream("ValidationMessages.properties");
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String l = null;
try {
    while ((l = br.readLine()) != null) {
        LOGGER.info(String.format("Line: %s", l));
    }
} catch (IOException ex) {
    LOGGER.error(ex.getMessage());
}
 // Validation logic goes here 

上面的代码非常好用。我正在获取ValidationMessages.properties

中指定的所有行

目前我正在使用JBossAS7.0.2所以我的任何人都会给我一些建议如何解决它并接收已解决的文本而不是密钥?非常感谢

1 个答案:

答案 0 :(得分:2)

用大括号包裹你的留言键:

@Constraint(validatedBy = NobleValidator.class)
@Documented
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
public @interface Noble {
    String message() default "{NOT_NOBLE}";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}