0

アプリケーションのテストで、データベースをシャットダウンすることにしました。

public Object getEntityById(Class<?> clazz, Object _id) throws PersistenceServiceException {
    Object o = null;
    try {
        o = entityManager.find(clazz, _id);
    } catch (Exception e) {
        throw new PersistenceServiceException(e);
    }
    return o;
}

そのため、データベース例外は呼び出し元に渡す必要があります

そして、私が持っているコントローラーで

    try {
        template = (Template)persistenceService.getEntityById(Template.class, id);
    } catch (PersistenceServiceException e) {
        response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        response.setStatusMessage("INTERNAL SERVER ERROR");
        response.setData(e);
        return  response;
    }

デバッグ時に、DatabaseException がスローされていることがわかります。

しかし、サーブレットのコンテキストでは、これを取得したら...

<beans:bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <beans:property name="defaultErrorView" value="core/error.uncatched" />
</beans:bean>

上記のエラーを未処理として扱い続けます。

コントローラーでそれをキャッチするにはどうすればよいですか?なぜそれが起こっているのですか?

例外

ERROR: org.springframework.transaction.interceptor.TransactionInterceptor - **Application exception overridden by commit exception**
com.company.exceptions.PersistenceServiceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.6.0.v20130619-7d05127): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
4

3 に答える 3

0

スタック トレースは、次の 2 つの例外を示しています。

内部例外: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: 通信リンク障害

これは、データベースにアクセスできないことを意味します。これは、データベースをシャットダウンしたためです。ここでは、この例外について説明します。

エラー: org.springframework.transaction.interceptor.TransactionInterceptor -コミット例外によってオーバーライドされたアプリケーション例外

Spring フレームワークのトランザクション インフラストラクチャのデフォルト構成では、スローされた例外が未チェックの例外である場合にのみ、ロールバックのトランザクションをマークします。をチェック済み例外として定義した場合PersistenceServiceException、Spring トランザクションでロールバックは発生しません。(メソッドで) 未チェックの例外をキャッチし、それをチェック済みgetEntityByIdの例外に変換してから、このチェック済みの例外をスローしています。

これを解決するには、トランザクションをロールバックするようにトランザクション インフラストラクチャを構成しますPersistenceServiceException

をランタイム例外に変更PersistenceServiceException(PersistenceServiceException は RuntimeException を拡張)

またはサービスに注釈を付けることによって

@Transactional(rollbackFor = PersistenceServiceException.class)

于 2013-09-06T03:51:35.950 に答える
0

実際には、Transactional コンテキストが TransactionSystemException (RunTimeException) をスローしているため、私が行ったラップされた例外は、TransactionSystemException によって再びラッパーになっています。この最後のものは、コントローラの catch 句に追加する必要があります。

とにかく、私は今それを正しいとはマークしていません。誰かが何かを追加したい場合は、大歓迎です。

于 2013-09-05T18:09:52.123 に答える
0

PersistenceExceptionを使用して例外をキャッチする必要があります。JPA を使用しているためです。

于 2013-09-05T07:04:23.880 に答える