このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。
そういえば、プロトコルを保留していた。
というのも、プロトコルは集合型の型(String[])なのだ。
こういった単純値ではないプロパティの検証の場合、
ルールがどのように機能するかどうかを知る必要がある。
Struts の Validator が用意しているほとんどのルールは、
文字列に対して適用するものなので、
評価する前に強制的に文字列化される。
文字列以外の場合、toString() の値が評価されるのだ。
しかし、これにはちょっとした例外がある。
対象となる値が、String の配列であるか、
または Collection インタフェースを実装している場合で、
かつ、これらに 1 つも要素が存在しない場合は、
toString() ではなく、空文字列として扱われる。
例えば、文字列配列の toString() は、
"[Ljava.lang.String;@33c3e6" 等の文字列値になるが、
要素が 1 つもない場合に限り、空文字列として扱われる。
これは required ルールの利便性を考慮したものだろう。
さて、プロトコルは、最低 1 つを選択しなければならない。
つまり、rule.protocols が参照する配列に、
1 つ以上の要素が格納されている必要があるわけだ。
今回、rule.protocols は String[] なので、
required ルールがぴったりとなる。
では、設定に追加してみよう。
========== /WEB-INF/validation.xml ==========
(…省略…)
<!-- プロトコルは最低一つ選択 -->
<field property="rule.protocols"
depends="required">
<msg name="required"
key="errors.required.selection" />
<arg name="required" position="0"
key="property.FilterRule.protocols" />
</field>
(…省略…)
========== end of /WEB-INF/validation.xml ==========
これで、プロトコルを 1 つもチェックしなかった場合、
filterRuleForm の rule.protocols は空となるので、
「プロトコルを選択してください。」とメッセージが出る。