そういえば、プロトコルを保留していた。
というのも、プロトコルは集合型の型(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 は空となるので、
「プロトコルを選択してください。」とメッセージが出る。