1

我在正确设置我的自定义 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 放到我的类路径根目录中,我希望它应该是 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,所以我的任何人都给我一些建议如何修复它并接收解析的文本而不是密钥?非常感谢

4

1 回答 1

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 {};
}
于 2012-08-03T08:23:02.760 回答