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(); }
DATE : 2006/12/06 (Wed)
引数に渡された値が null であれば例外を投げるという場面は数多くあると思います。
例えば、引数に null を許可しない setName(String) メソッドを考えると、次のようなコードになります。このメソッドは、引数に渡された文字列を name フィールドに設定するという処理を行います。
/** * <p>名前を設定します。</p> * * @param name 設定する名前 * @throws IllegalArgumentException name が null の場合 */ public void setName(String name) { if (name == null) { throw new IllegalArgumentException("引数が null です。"); } this.name = name; }
Jakarta Commons Lang 2.0 以降の org.apache.commons.lang.Validate クラスにある notNull メソッドを使用すると、null チェックの部分を簡略化することができます。
例えば、Validate#notNull(Object, String) は、第1引数が null であれば第2引数のメッセージを設定した IllegalArgumentException を投げます。
notNull メソッドを使うと、上の例は次のようになります。(import 文などは省略しています)
public void setName(String name) { Validate.notNull(name, "引数が null です。"); this.name = name; }
メッセージが「The validated object is null」という英文でも構わない場合は、第2引数のないValidate#notNull(Object) が使えます。
public void setName(String name) { Validate.notNull(name); this.name = name; }
notNull メソッドの行っている処理は非常に簡単なものですが、引数チェックを書く手間がかなり省けます。また、うっかりして null の判定を間違える心配もなくなります。
この他にも、Validate クラスには引数チェックを行う場合に便利なメソッドが揃っています。
(*´∀`)引数チェックは定型的な処理が多いので、このようなクラスは非常に便利ですね。
DATE : 2006/12/04 (Mon)
朝、鞄を持ち上げる腕に痛みが……。
(;^ω^)どうみても Wii のおかげです。本当にありがとうございました。
そして、どうみても運動不足です。本当にありがとうございました。
(;´Д`)「Wii Sports」の体力測定で68歳と認定されてしまいました……orz
DATE : 2006/12/03 (Sun)
「Aggregating Maven Javadoc Plugin - Javadocs for Multi-Projects」から、全モジュールをまとめた Javadoc を生成する設定をメモしておきます。
通常、複数のモジュールで構成されているプロジェクトで javadoc:javadoc ゴールを実行すると、モジュールごとに別々の Javadoc が生成されます。しかし、プロジェクトで最上位の pom.xml に設定を行うと、プロジェクト全体のドキュメントを生成できます。
具体的には、maven-javadoc-plugin の設定で aggregate 要素を true に設定します。(以下の例で「...」は省略を表します)
... <reporting> <plugins> ... <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> <configuration> ... <aggregate>true</aggregate> ... </configuration> </plugin> ... </plugins> </reporting> ...
maven-javadoc-plugin を設定している部分が build 要素内ではなく reporting 要素内である部分に注意してください。reporting 要素とは、プロジェクトに関するレポート(ウェブページや Javadoc、テスト結果など)の設定を行う部分です。
aggregate 要素を false にすると、通常通り、モジュールごとの Javadoc が生成されます。
参考文献
DATE : 2006/12/02 (Sat)
Wii を購入しました。
午後3時ごろに近くのトイザらスへ行ったのですが、「当日分はすでに売り切れ」という張り紙が入口にありました。とりあえず、「はじめての Wii」を買おうと売り場へ急いだのですが、これもすでに売り切れていました。
(;^ω^)Wii リモコンが1個付いているので、ハードと同時に購入しようとされた方が多かったのでしょう。
そして、「ゼルダの伝説 トワイライトプリンセス」も残り1、2本という状態でした。
(;^ω^)さすが人気作……というところですね。
というわけで、早速「Wii Sports」をプレイしてみました。
(;´Д`)これはすごいです。
リモコンを振ればキャラクターがきちんと球を打ったり投げたりしてくれますし、振動やリモコンに備え付けのスピーカーからの音など、反動が感じられるような工夫がされています。
特に感動したのが、「ボーリング」です。
「ボーリング」の場合、まっすぐに投げたはずの球が右に曲がったりします。実は、Wii リモコンが投球時に傾いていると、その方向にボールが曲がります。つまり、その人の投球の癖が球筋に反映される仕組みになっていたのです(もっとも、実際のボールと違って Wii リモコンは軽いので、リモコンを傾けずに投げようと思えば簡単に投げられます)。
それにしても、Wii Sports を長々とやっているとさすがに腕が疲れてきます。
(;´Д`)これは、明日は筋肉痛かもしれません。
個人的には、この他に「おどる メイド イン ワリオ」も面白そうです。
(;´∀`)が、これはまあ、お財布と要相談ですね……。