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

B gluegent.com Masataka Kurihara kurihara
2004年 3月 4日 (木) 16:58:44 JST


栗原です。

  先ほど、やっと気持ち悪かったところがわかって、理解しました。
ひがさん、すごいですねぇ。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 が返ってくるのにびっくり
することなく便利かと思います。

} else {
  Object ret = joinpoint.proceed();
  if (ret == null) {
    throw new NoSuchSqletRuntimeException(methodName);
  }
  return ret;
}

  こんな感じ。

--
株式会社グルージェント
栗原 傑享(くりはら まさたか)
渋谷区渋谷3-7-6 第6矢木ビル4F
TEL:03-5469-8869 FAX:03-5469-8879
URL:http://www.gluegent.com/
--





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