1. 無料アクセス解析

crossroad's Blog

Javaを中心にした技術ネタなど。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

S2Daoの例外ハンドリング

S2Daoを使ったアプリケーション設計を考えているのですが、
ひとつ課題に直面しました。

それはS2Daoが送出する例外です。
S2Daoはデータベースアクセス時にエラーが発生すると、
実行時例外を投げます。


この時、例外の種類によってはエラーとはせずに、アプリケーション
内部でハンドリングしたい場合があります。

例えば、レコード更新時の楽観的排他制御に引っかかった場合、
NotSingleRowUpdatedRuntimeExceptionが送出される
ようなのですが、この場合はエラーとはせずに例外を無視したり、
リトライを試みる、などです。

このような例外ハンドリングをする場合は、その例外の型を
知っておかなければなりません。


ここで問題なのが、S2Daoはインターフェースとして定義し、
実装(ロジック)を記述しない(しなくて良い)と言う点です。
つまり、例外ハンドリングはDaoではできず、その呼び出し元である
ビジネスロジックで行なうことになります。
と言う事は、ビジネスロジックが例外の型を知っておく必要があり、
ビジネスロジックがS2DaoのAPIに依存してしまうことになります。

J2EEのWebアプリケーションで一般的な多層アーキテクチャでは
各層の依存関係を持たせたくないので、上記のように
ビジネスロジック層がデータアクセス層の実装に依存してしまうのは
望ましくないと思っています。


はて、どうしたものか。。。と思っていたのですが、
S2AOPのThrowsInterceptorを使うことを思いつきました。
S2Daoで作ったDaoに対して、ThrowsInterceptorを設定することで、
上記のようなS2Dao固有の例外をキャッチし、抽象的な例外で
ラップして送出します。

public class S2DaoThrowableInterceptor extends ThrowsInterceptor {
 public void handleThrowable(
    NotSingleRowUpdatedRuntimeException e,
    MethodInvocation invocation) throws Throwable {
  throw new DaoException(e);
 }
}


のような感じです。
ここで送出しているDaoExceptionはアプリケーションで独自に定義
した例外で、S2Dao等の特定のプロダクトに依存しません。

そして、このアスペクトをDaoに設定するdiconファイルは以下のようになります。

<components>
 <component
  name="s2DaoThrowableInterceptor"
  class="hoge.S2DaoThrowableInterceptor"/>


 <component class="hoge.IHogeDao">
  <!-- dao.interceptorより前に記述しないと機能しない -->
  <aspect>s2DaoThrowableInterceptor</aspect>
  <aspect>dao.interceptor</aspect>
 </component>
</components>

※S2Daoへのアスペクトの追加は、dao.interceptorより前に記述しないと
 追加したアスペクトが機能してくれませんでした。


こうすることで、ビジネスロジック層ではDaoExceptionを受け取る
ことになり、S2Dao固有の例外を意識しなくて済むはずです。

これで、一件落着。
しかしもっとシンプルな方法がありそうな気も。。。

関連記事
スポンサーサイト

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2006/08/11(金) 01:04:09|
  2. ソフトウェア開発 Seasar
  3. | トラックバック:0
  4. | コメント:0
<<javadocでIllegalArgumentException | ホーム | DIコンテナの価値・メリット>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://bagineer.blog59.fc2.com/tb.php/22-ef4f2fae
この記事にトラックバックする(FC2ブログユーザー)

プロフィール

crossroad

Author:crossroad
関西在住。男。
フリーランスのソフトウェアエンジニア。
エレキベース(Rock&Roll)とお酒が好物でございます。

カテゴリー

タグリスト

Java F1 フリーランス ベーシスト HARRY TheStreetSliders iPhone FX お酒 Seasar Maven eclipse Wicket マイホーム 野球 プロジェクトファシリテーション Rails Ruby UML お店 ソフトウェア Tomcat S2Flex2 jsf Teeda Eclipse タグライブラリ ajax タスク europa mylyn trac 

ブログ内検索

最近の記事

最近のコメント

最近のトラックバック

カレンダー

08 | 2017/09 | 10
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

月別アーカイブ

全ての記事を表示する

全ての記事を表示する

Twitter


RSSフィード

リンク

このブログをリンクに追加する

アクセスカウンタ

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。