0

このアプリケーションには、次のレイヤーと相互作用があります。

ビュー(JSP)->Ajax呼び出し->MyController(Spring Controllerを実装)->カスタムサービスルックアップを介して-> MyService(ベースサービスを実装)-> My DAOimpl

私たちのアイデアは、例外のロギングにAOPを使用することです。AOPインターセプトを単純に保つために、コントローラーのカットを定義することにしました。コントローラには、handleRequestメソッドから呼び出されるonLoad、onUpdate(CRUD opsに関連する)などのいくつかのメソッドがあり、poitncutに対してこれらのメソッドを定義したいと思います。つまり、サービスレイヤー以下での例外は、バブルアップしてコントローラーに到達します。スロー例外をインターセプトし、例外の詳細をログに記録するように定義されたAOPポイントカット。その後、エラーコードがビューに返送され、エラーメッセージが適切に表示されます。

問題:-AOPがonLoadなどのメソッドの呼び出しをインターセプトしません。これは、handleRequestからのこれらのメソッドの呼び出しが、コントローラーでの自己呼び出しとして扱われるため、AOPがそれらをインターセプトしないためであると理解しています。-上記の問題を回避するために、onLoad、onUpdateメソッド、およびonLoadなどのメソッドを実装する一連のutilクラスを使用してインターフェイスを作成しました。コントローラには、これらのutilsがメンバーとして含まれます。ポイントカットは、コントローラーではなく、これらのユーティリティで定義されます。これを行う場合、AOPは、AOP構成がspring-servlet xmlに存在し、AOP宣言のカスタムxmlには存在しない場合にのみ機能します。この観察は、コントローラーのみを対象としています。AOPカットがサービスレイヤーで定義されている場合、宣言は期待どおりに機能します(カスタムxmlで)。

必要な提案:-コントローラーに対してAOPを定義する必要がありますか?これはサービスレイヤーでのみ定義する必要がありますか?コントローラでは、例外が「キャッチ」され、エラーメッセージが送信されて適切に表示されます。元のアプローチに根本的な問題があるかどうかを確認したかった。

4

1 に答える 1

0

サービス層で例外をキャッチし、変換を行う製品でも同様のことを行います。この翻訳には 2 つの側面があります。もちろん、1つはI18Nに関係しています。もう 1 つの変換は、低レベルの例外が製品から出ないようにすることです。代わりに、そのような例外は一般的な例外に変換されるため、例外リークが防止されます。

サービスレイヤーで例外をキャッチすることは良い習慣だと思います。これにより、下位レイヤーが例外処理から解放されるためです(そうしないことを選択した場合)。さらに、翻訳やその他のアクションを行う機会を与えてくれます。

ありがとう、ラグー

于 2012-11-27T21:09:58.410 に答える