6.Converter

さて今日はConveter。これは、Baoの中で定義する定数アノテーションの1つです。
まずはマニュアルの該当部分を見てみますか。

CONVERTER
値の自動変換のためのアノテーションです
オプション

主キーのidを渡されてDtoを読み込んだり、他のフローなどから呼びだされたときに別のDtoから変換するためのアノテーションです。

ex)
public static BuriConvert CONVERTER[] = new BuriConvert[]{
new BuriConvert(Long.class,"FurnitureItemDao.getFurnitureItem(#data)")
};

Long.class型の引数を発見すると自動的にFurnitureItemDao.getFurnitureItem(#data)を呼びだしてその戻り値を#dataとして処理します。

要は、Baoの中に定義されているメソッドで、そのBaoが処理するべきDto以外のオブジェクトを引数として渡されたときに、そのオブジェクトをキーにして本来のDtoオブジェクトに変換するメソッドを呼び出すということね。


FurnitureManagementBaoでは、CONVETERはこう書かれてます。って、マニュアルに載ってるのとまったく一緒だけど。




    public static BuriConvert CONVERTER[] new BuriConvert[]{

        new BuriConvert(Long.class,"FurnitureItemDao.getFurnitureItem(#data)")

    };


CONVERTER定数アノテーションの型は、BuriConvertオブジェクトの配列。BuriConvertクラスのコンストラクタ引数には、変換元のオブジェクトの型と、変換する際のロジックをOGNLで記述します。ここでは第一引数にLong.class、第二引数に"FurnitureItemDao.getFurnitureItem(#data)"と書かれているので、Baoのメソッド内でLong型引数を持つものがあったら、FurnitureItemDaoのgetFurnitureItemメソッドを呼び出します。ちなみに、引数中の"FurnitureItemDao"ってのは、クラス名を示しているわけではなく、diconファイル内で定義されたコンポーネント名です。このチュートリアル中のサンプルではクラス名=コンポーネント名として記述しているので一見勘違いするかもしれませんが、S2Buri中でOGNLを書けるところは(多分)全て、このようにdicon中のコンポーネント名を使ってS2管理下のコンポーネントを呼び出せるのです。
さて、このFurnitureItemDaoのメソッドのシグネチャはこうなってます。




    public FurnitureItemDto getFurnitureItem(String furnitureID);


引数はLong型なのかと思いきやString型……。ちょっと意外。OGNLの制限で、こういうのはString型じゃないと駄目ってこと??よくわからんかったので、無理矢理引数をString型からLong型に変えてみたところ、問題なく実行できた。どっちでもいいらしい。ふーん。

このConverterの使い道としては、基本的には、テーブル中のキーとなるオブジェクトを引数に、Daoのメソッドを呼び出してDtoを引っ張ってくる、という使い方になるでしょーね。いちいち自分でDaoを呼び出さなくて済むようになると。便利!

あと注意事項としては、CONVERTERが有効なのは、Baoのメソッドの中でも、フロー遷移用のメソッドのみ、ってこと。Baoが持っているもう一つのメソッド、データ取得用のメソッド(get/select/find/countで始まるメソッド)では、CONVERTERが指定されてても変換されません。ま、役割から考えれば当然なんですけど。

また、CONVERTERアノテーションを書くと、Bao中の全てのフロー遷移用メソッドで有効になりますが、個別のメソッドごとに定義したい場合は、_CONVERTERアノテーションを使います。"メソッド名_CONVERTER"という名前で定数を宣言する以外はCONVETERアノテーションと一緒。


さて、今回はこれまで……、って思ったけど、今回はいつもより短いし時間も余ってるので、Baoのフロー遷移メソッドが呼び出されてから、実際にフロー遷移が行われるところまでのシーケンスを纏めてみた。Converterに関係ないところはざっくり省略。

簡単にここに出てくるオブジェクトの説明も書いておく(間違いあるかもしれんけど)。

オブジェクト名 説明
プログラム 自分で実装するところ
BaoInterceptor Baoの呼出しをインターセプトするクラス
BaoInvoker BaoInterceptorが、実際の処理を委譲するクラス
BaoInvokeMetaData Baoのメタデータアノテーションの情報)を保持するクラス
ScriptProcessor OGNLの解釈・実行を行うクラス
BuriEngine フロー遷移を実行するクラス