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=フーバーは高貴ではありません

仕様(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 に答える