2007 年 5 月 10 日 23 時 58 分

Validator 設定 #2: arg 要素


このアーカイブは同期化されません。 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 インスタンスを作成するのである。

これで、ちゃんとメッセージが表示されるようになった。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.