[Seasar-user:8651] Re: [S2Dao] Bean のプロパティに基本型以外を使う方法

Nakata Kouji [E-MAIL ADDRESS DELETED]
2007年 6月 25日 (月) 17:16:30 JST


なかたです。
回答ありがとうございます。

07/06/25 に Yasuo Higa<[E-MAIL ADDRESS DELETED]> さんは書きました:
> ひがです。
> > >
> > >
> > > > S2Dao を使って、SELECTの結果を Bean で受け取るときに、Bean のプロパティ
> > > > に基本型(String, Integer など)以外を使う方法はないのでしょうか?
> > > > Enum や、特殊なデータ型クラスを使いたいのですが。
> > > >
> > > > カラムに対応するプロパティのクラスに
> > > > ・static で
> > > > ・valueOf という名前で
> > > > ・戻り値がそのクラスのインスタンス
> > > > のメソッドがあれば、それを実行して格納する。
> > > > なんていう改造は可能なのでしょうか?
> > >
> > > 以前BeanのプロパティにEnumを使えないかという質問があり、
> > > そのときはVALUE_TYPEアノテーションを使用すれば可能と
> > > いう話になっています。
> > >
> > > http://ml.seasar.org/archives/seasar-user/2007-March/008815.html
> > > http://ml.seasar.org/archives/seasar-user/2007-March/008860.html
> > >
> > > 適用できないか、ご検討いただけないでしょうか。
> >
> > なるほど。方法はあるのですね。
> > しかし、数が多いのですべてこれでやるのは大変です。
> >
> S2Dxoを使えば、自動的に変換されます。
> http://ml.seasar.org/archives/seasar-user/2007-April/009023.html
> のスレでS2Dxoに取り込まれたいきさつも見れます。
>
> もし、Teedaをお使いなら、EntityはStringで定義しておいて、
> Pageクラスでenumを使うと良いのではないでしょうか。

まず、前提として、ビジネスロジックが操作する Entity クラスで
Enum を使いたいのです。

String でまず受けておいて、Dxo を使って変換すればいいのは
わかっていましたが、そのために、基本型のプロパティを持つ中間的な
Bean を用意すると二重管理になってしまって、同期のための余計な
手間がかかりそうなのがイヤだったのです。そこで、直接 S2Dao の結果が
Enum やユーザ定義型クラスになっているといいのになぁ、というのが
そもそもです。

で、ちょっとソース追っかけましたが、
org.seasar.framework.beans.impl.PropertyDescImpl クラスで、
216:        } else if (arg instanceof String &&
!String.class.equals(propertyType)) {
217:            return convertWithStringConstructor(arg);

こういう処理をしていますね。ユーザ定義型の方はなんとかして、
String を引数に取るコンストラクタを用意すればこの処理でインスタンスを
生成してくれるのでいいのですが、
・String を引数にできないクラス(Enum)
・arg が String でない場合
のときに、

> > > > ・static で
> > > > ・valueOf という名前で
> > > > ・戻り値がそのクラスのインスタンス
> > > > のメソッドがあれば、それを実行して格納する。
なんてことはできないのでしょうか?



Seasar-user メーリングリストの案内