【问题标题】:BeanValidation: Messages from ValidationMessages.propertiesBeanValidation:来自 ValidationMessages.properties 的消息
【发布时间】:2012-08-02 19:00:46
【问题描述】:

我在正确设置我的自定义 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,所以我的任何人给我一些建议如何修复它并接收解析的文本而不是密钥?非常感谢

【问题讨论】:

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


    【解决方案1】:

    将您的消息密钥用大括号括起来:

    @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 {};
    }
    

    【讨论】:

    • 该死的。我必须和我的眼科医生谈谈。非常感谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-18
    • 2012-05-30
    • 1970-01-01
    相关资源
    最近更新 更多