このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。
ERROR: Resource key "errors.required" not found in default bundle
このエラーメッセージから、以下のことが推測できる。
・Validator はエラーメッセージにリソースを使用している。
・キーが「errors.required」のリソースが必要である。
・リソースとして MessageResource が使われている。
「default bundle」というのは、
Struts 設定ファイルで指定した <message-resources> で、
key 属性を指定していないものを示している。
以前、jp.loafer.test.resources.Messages を、
<message-resources> として登録してあったはずだが、
このリソースには「errors.required」が確かに存在しない。
では、試しに「errors.required」を登録してみよう。
日本語用の Messages_ja.properties に追加する。
========== Messages_ja.properties ==========
# Validator 関係
errors.required = 値を入力してください。
(…省略…)
========== end of Messages_ja.properties ==========
これで実行してみると、予想通り、
「値を入力してください。」と表示されるようになった。
「required」ルールは、もし値が適合しなかった場合、
Struts に登録されている既定のメッセージリソースより、
「errors.required」というキーを探して表示するのである。
でも「値を入力してください。」だけなら、
どのフィールドでエラーが発生したか分からないので、
エラーメッセージに、項目の名前を追加して表示したい。
・発信アドレスを入力してください。
・発信ポートを入力してください。
Validator 設定ファイルの <arg> 要素を利用すると、
基本となるメッセージの一部を置換することができる。
まず、「errors.required」に基本となるメッセージとして、
{0} などの置換パラメータを含めておく。
これは、MessageFormat によって書式化される。
そして、埋め込まれる文字列も、
同じようにリソースに定義しておく。
========== Messages_ja.properties ==========
# Validator 関係
errors.required = {0}を入力してください。
# プロパティ名
property.FilterRule.action = 処理
property.FilterRule.protocols = プロトコル
property.FilterRule.source.network = 発信アドレス
property.FilterRule.source.port = 発信ポート
property.FilterRule.destination.network = 宛先アドレス
property.FilterRule.destination.port = 宛先ポート
property.FilterRule.note = 備考
(…省略…)
========== end of Messages_ja.properties ==========
ポイントとしては、基本となるメッセージの方は、
「ルール」を表す内容にしておき、
埋め込まれるメッセージの方は、
「フィールド名」を表す内容にしておくことである。
そうすれば、どのような組み合わせになっても自然になる。
続いて、Validator 設定ファイルに <arg> 要素を追加する。
========== /WEB-INF/validation.xml ==========
(…省略…)
<form name="filterRuleForm">
<!-- 発信アドレスは必須-->
<field property="rule.source.network"
depends="required">
<arg name="required" position="0"
key="property.FilterRule.source.network" />
</field>
<!-- 発信ポートは必須-->
<field property="rule.source.port"
depends="required">
<arg name="required" position="0"
key="property.FilterRule.source.port" />
</field>
</form>
(…省略…)
========== end of /WEB-INF/validation.xml ==========
<arg> 要素は、<field> 要素の子として追加する。
name 属性はルールの名前であり、
<field> 要素の depends 属性で指定したルールと合わせる。
position 属性は、置換パラメータの番号(位置)、
そして key 属性は、置換されるメッセージが格納された、
メッセージリソースのキーである。
Struts Validator はこれらパラメータを使い、
ActionMessage インスタンスを作成するのである。
これで、ちゃんとメッセージが表示されるようになった。