DATE : 2006/12/09 (Sat)
JSF には、ビュー(HTML のフォームなど)と モデルデータオブジェクト間で値を変換するために Converter を使用します。
例えば、javax.faces.convert .DateTimeConverterを使用すると、ユーザがビューに入力した文字列や選択した項目を java.util.Date オブジェクトに変換できます。また、逆にモデルデータオブジェクトの Date オブジェクトを持つプロパティから、ビューに表示する文字列に変換することもできます。
Converter は、javax.faces.convert.Converter を実装することで自作できます。本記事では、Converter を実装する際のポイントをメモしておきます。
Converter の行う変換は、ビューからモデルデータオブジェクトへ行うもの、モデルデータオブジェクトからビューへの変換を行うものの2種類があります。
変換 | 変換を行うメソッド |
---|---|
ビュー → モデルデータオブジェクト | getAsObject |
モデルデータオブジェクト → ビュー | getAsString |
Converter を実装する際には、引数なしのコンストラクタを用意する必要があります。
なお、必ずしも上の2つのメソッド全てをしっかり実装する必要はありません。行う変換が1種類のみであれば、片方は簡単な実装で済ませても構いません。
ただし、変換対象のオブジェクトとして、null が渡されることがあるので注意が必要です。例えば、モデルデータオブジェクトからビューへの変換では特に処理を行わない場合(例えば、モデルデータオブジェクトのプロパティが String などで変換の必要がない場合)、次のようなコードを書いてしまうことがあります。
public String getAsString( FacesContext context, UIComponent component, Object value) { if (context == null || component == null) { throw new NullPointerException(); } return object.toString(); }
しかし、変換対象のモデルデータオブジェクトのプロパティが null だった場合、引数 value も null となるため NullPointerException が発生します。
value が null の場合、Converter#getAsString(FacesContext, UIComponent, Object) の仕様では長さ0の文字列を返すという仕様になっています。
そのため、特に処理を行わないメソッドは、次のように書く必要があります。
public String getAsString( FacesContext context, UIComponent component, Object value) { if (context == null || component == null) { throw new NullPointerException(); } if (value == null) { return ""; } return value.toString(); }