JSFの入力コンポーネント(h:inputTextなど)のrequired属性は明らかに設計ミスだ。これのせいで、エラーメッセージのカスタマイズの自由度が理不尽に下がっている。
required="true"だと、入力欄を空でポストバックしたとき、「{0}: Validation Error: Value is required.」というエラーメッセージになる。{0}はプレースホルダで、デバッグ用の情報が表示される。このメッセージ自体は置き換えられるが、さて、たとえば「キーワードを入力してください」や「***必須項目***」のように、場所によってエラーメッセージを使い分けたいときは、どうするか。どうしようもない。そういうことはできない設計である。
required="false"の場合は、コンバータもバリデータも呼び出されない。つまり通常のやりかたで通常のエラーメッセージを出すことはできない。非常手段、PhaseListenerのほかに手段がない。
もし、required属性を使わない、すべてをバリデータで済ませる設計をしていたら、メッセージパターンごとにそれぞれカスタムバリデータを作ることで対応できたはずだ。
どうしてこんな設計ミスが生じたのか。私見では、その根源はnullにある。nullは呪いだ。現在、ほぼすべてのプログラマは、nullの呪いにかかっている。
空の入力欄は、長さゼロの文字列か、それとも何か特別なもの――null――だろうか。もし後者に思えるとしたら、それはnullの呪いにかかっている。
金槌を持つとすべてが釘に見えるように、nullを持つと境界値がnullに見える。そして境界値の扱いを誤り、required属性の設計ミスに至る。
intとポインタをキャストする世界(古き悪しきC言語)では、NULLの害などちっぽけだったかもしれない。しかしそろそろnullは許されなくなってきた。Nullless Programming時代の到来を望む。