私はすべての検証制約を共通のライブラリに集めていました。jar のルートにValidationMessages_it.properties
ファイルを配置しました。このライブラリを jsf 2 war プロジェクトに配置すると、すべての検証メッセージが正しく表示されます。ValidationMessages_it.properties
ただし、戦争アーティファクトに別のものを入れると問題が発生します。この場合、{library.message_key}
文字列が表示されます。
Bean Validation は戦争で適切なプロパティ ファイルを見つけ、ライブラリでそれを考慮していないと思います。どうすれば解決できますか?
例
カスタム制約を含むライブラリ commons.jar があります。これらの制約にメッセージを設定するためにValidationMessages_it.properties
、このライブラリのルートにを追加しました
commons.jar
|
+ library
| |
| + CustomConstraint.class
|
+ ValidationMessages_it.properties
ValidationMessages_it.properties
library.custom=Questo è l'errore di cui parlavo
CustomConstraint.java
@Pattern( regexp = "[a-z]", message = "{library.custom}" )
@Constraint( validatedBy = {} )
@Documented
@Target( { ElementType.METHOD, ElementType.FIELD } )
@Retention( RetentionPolicy.RUNTIME )
public @interface CustomConstraint {
String message() default "C'è un errore";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
PS: メッセージ キーは message() ではなく @Pattern アノテーションにあることに注意してください。これは間違いのように思えるかもしれませんが、そうでなければ機能しません!
commons.jar
その後、これを自分の Web アプリ プロジェクト (jsf/mojarra 2.1) で使用したいと考えています。すべて正常に動作します。表示されるエラー メッセージは「Questo è l'errore di cui parlavo」です。
ValidationMessages_it.properties
しかし、ここで、webapp で新しい検証制約を定義するとします。そのため、 inWEB-INF/classes
フォルダーを追加して、これらの制約の翻訳を提供したいと考えています。この場合、表示されるエラー メッセージは「{library.custom}」です。
したがって、BV(またはjsf?)は戦争でバンドルを見つけ、commons.jarでそれを考慮していないと思います。フォルダに存在するキーlibrary.custom
が見つからないため、文字通り返されます。ValidationMessages_it.properties
WEB-INF/classes
{library.custom}
例 2
共有ライブラリの Bean Validation 制約に基づいて、私のパッケージ構造は正しいようです。問題を示すために、単純な Web アプリをアップロードしました。
Glassfish 3.1.2、JBoss AS 7.1.1、Geronimo 3.0.0 で webapp をテストしました
Glassfish と JBoss の動作は同じです。Geronimo では、もう少しうまく機能します。