[Seasar-user:434] Re: AOP-DAO

B isid.co.jp Yasuo Higa higa
2004年 3月 4日 (木) 17:45:18 JST


<[E-MAIL ADDRESS DELETED]> の、
   "[Seasar-user:433] Re: AOP-DAO" において、
   "Masataka Kurihara <[E-MAIL ADDRESS DELETED]>"さんは書きました:

ひがです。

> 栗原です。
> 
>   先ほど、やっと気持ち悪かったところがわかって、理解しました。
> ひがさん、すごいですねぇ。AOPを使う意味があるという構想が別のこ
> と検証していて気がつきました。本質的でなくても、意味ありますよ。
> 「テスト実装できますね」という私の、このスレッドの直近の質問は、
> 
> > public Object invoke(Joinpoint joinpoint) throws Throwable {
> >   String methodName = joinpoint.getMethod().getName();
> >   Query query = dao_.getQuery(methodName);
> >   if (query != null) {
> >     return query.invoke(jointpoint.getArgs());
> >   } else {
> >     return joinpoint.proceed();
> >   }
> > }
> 
>   ここの最後の joinpoint.proceed() で、EmployeeDao がインターフ
> ェイスであるために呼び出すメソッドの実体がないから、NoSuchMethod
> だなあということで引っかかってたのですが、まあリリースの実装では
> ここは例外処理でもしておくんだろうと流しつつわき道にそれて出てき
> た質問だったのですが、ソース読んだところ、JoinpointImpl#proceed() 
> にて、Abstract メソッドがどうか判定しているところで、実行してその
> 結果を返すか、nullを返すか分岐しているんで、もし Sqlet の XML に
> 該当するクエリーもテスト用実装クラスも両方用意してなかったらここ
> に処理が移って null が返るわけですね。よってメソッド無いよって例
> 外は出ない。
>   となると、この S2DaoAdvice#invoke() 中の JoinpointImpl#proceed() 
> のところで返りの null チェックをして、そんなクエリーは無いよとい
> う例外(NoSuchSqletRuntimeException みたいな?長いな。。。)をス
> ローしてくれると、これまた予想外の null が返ってくるのにびっくり
> することなく便利かと思います。
> 
いやー、良く見てますね。
Queryが見つからなかったときに、joinpoint.proceed()しているのは、
実は別の意味があります。

SQLの組み立てが複雑なときって、S2DaoのXMLで組み立てるより、
直にJavaのロジックで組みたいなんてニーズもあるかなと思ったわけです。
そのとき、foo,barメソッドのうち、fooはJavaで実装してbarは
XML(S2Dao)で処理したいときに、fooをjoinpoint.proceed()で
処理したいなと。

S2Daoでは、DbUtilsのようにSQL文を自前で組み立てて実行する機能も
提供します。
Sqletの内部でやっていた処理を外に開放したいと思ってます。

Query query = new QueryImpl():
query.addSql("SELECT ... ? ...");
query.addBindVariable(hoge);
ResultSetHandler rsHandler = new BeanListHandler(Employee.class);
query.setResultSetHandler(rsHandler);
return query.executeQuery();

JoinpointImpl#proceed()でAbstractの場合に、nullを返しているのは、
親切そうに見えてかえってややこしくしているだけかも。
エラーを返すようにしたいと思います。
---
Yasuo Higa <[E-MAIL ADDRESS DELETED]>
INFORMATION SERVICES INTERNATIONAL-DENTSU,LTD.



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