2

Spring を使用して REST アプリケーションを作成しています。コントローラー、サービス、リポジトリの3層に分かれています。

リポジトリ レイヤーは、Spring データと MongoDb を使用しています。MongoDb からの例外は、Spring Data 例外に変換されます。

@ExceptionHandler アノテーションを使用して、リポジトリ層でこれらの例外をキャッチしようとしました。これはうまくいきませんでした。@ExceptionHandler で例外をキャッチする唯一の方法は、コントローラー層にコードを配置することです。

try/catch ブロックを使用せずに、リポジトリ レイヤーで例外をキャッチして処理する方法はありますか。

4

1 に答える 1

4

以下に示すように、Spring AOP を使用し、すべての DAO メソッドに対して @Around アドバイスを作成することで実行できます。

しかし、catch ブロックで何をしようとしているのかを理解したいと思います。さまざまな種類のデータ アクセス例外を処理するために、さまざまなロジックを用意する予定はありますか? 特定のロジックがない場合は、例外をコントローラー層に伝播させるだけで十分です。

最初のオプション

ここにサンプルがあります -

    @Aspect
public class DaoExceptionHandlerAdvice {
    @Around("execution( * com.xyz.daos.*.*(..))")
    public Object invokeService(ProceedingJoinPoint pjp) throws Throwable{
        MethodSignature methodSignature = (MethodSignature)pjp.getSignature();
        Object returnValue = null;
        try {
            returnValue = pjp.proceed();
        } 
        catch(Exception e){
            // handle the exception 
        }
        finally{
        }
        return returnValue;
    }
}

アプリケーション コンテキスト ファイルに次のスニペットを追加します。

<aop:aspectj-autoproxy />    
<bean id="daoExceptionHandler" class="com.xyz.advice.DaoExceptionHandlerAdvice"  ></bean>

詳細については、次のリンクを確認してください - Spring AOP

2 番目のオプション

私はこれを試したことはありませんが、おそらく例外トランスレーターを使用する方が簡単でしょう。おそらく HibernateExceptionTranslator を拡張して、そこに独自のロジックを含めることができます。

詳細については、このリンクをたどってください - 例外翻訳

于 2012-11-02T21:01:57.640 に答える