6

Spring3とHibernate3.6を使用したWebアプリケーションの開発に取り組んでいます。@Transactionalアノテーションとコードの構造についていくつか質問があります。

-> @Transactional(Springを使用したトランザクション管理)を使用する場合、@Transactional-annotatedメソッドを呼び出すときにtry / catchで囲む必要がありますか?

たとえば、オブジェクトをロード、変更、および返すメソッドを取得し、それを別のクラスから呼び出す場合、呼び出しをtry / catchで囲む必要がありますか?何かがうまくいかない、オブジェクトが返されない、データベース接続が失敗するなどの可能性があります。わかりません。

これまでは、@Transactional発生する可能性のあるすべての例外を処理し、エラーが発生したときにこのトランザクションのすべての操作をロールバックすると考えていました。しかし、それが発生した場合は、なんとかしてユーザーに通知する必要があります。try-blockでtransactional-methodを呼び出してロールバックすると、catchブロックがアクティブになりますか?そうすれば、ユーザーに「何かがうまくいかなかった」と言うことができます。そうしないと、ユーザーに通知されない可能性がありますか?

または、返されたオブジェクトがあるかどうかを確認するだけで十分ですか(if / else)、try / catchは必要ありませんか?私は新しいです、そして私は他が彼らのコードをどのように構造化するか聞きたいです。ありがとうございました :-)

4

3 に答える 3

4

Spring での例外処理は、HandlerExceptionResolvers と @ExceptionHandlers を使用すると非常に簡単です。私は @ExceptionHandler のみを使用する傾向があります。

@ExceptionHandlerを使用して、try-catch ブロックで自分で例外を処理する代わりに、特定の例外を処理できます。

ユーザーが見つからなかったリソースを必要としていて、404 を送信したい場合。

@ExceptionHandler(NotFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public void handleNotFoundException(NotFoundException exc) {
  // log something.
}

500 を送信したいサーバーの問題があった場合

@ExceptionHandler(SomeException.class)
public void handleException(SomeException exc, WebRequest request, HttpServletResponse response) {
    response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Sorry dude, my server broke");
}

また、例外を厳密に処理する必要があります。一般的にはそうすべきではありませんし@ExceptionHandler(Exception.class)、順番どおりに機能すると私も信じています。そのため、一般的な Exception を処理する場合は、クラスの最後のメソッドにする必要があります。

于 2011-03-21T14:34:15.953 に答える
1

Springで使用される主な機能は例外変換です。

クライアント層が理解する例外を生成するために例外変換に依存し、可能であれば、そこでのみtry/catchを使用します。

于 2011-03-21T14:41:05.543 に答える
0

答えてくれてありがとう。リンク(春のドキュメント)を読んだところ、次のことがわかりました。

「ただし、DAO はプレーンな HibernateException (チェックされていないため、宣言またはキャッチする必要はありません) をスローします。つまり、呼び出し元は、Hibernate 独自の例外階層に依存したくない場合を除き、例外を一般的に致命的なものとしてしか扱うことができません。特定の原因をキャッチする楽観的ロックの失敗などは、呼び出し元を実装戦略に結びつけることなしには不可能です. このトレードオフは、Hibernate ベースのアプリケーションや、特別な例外処理を必要としないアプリケーションには受け入れられるかもしれません."

私の DAO は Plain Hibernate 3 API に基づいているため、正しく理解している場合、私の DAO はプレーンな HibernateExceptions のみをスローします。それらはチェックされておらず、宣言またはキャッチする必要はありません。何か問題が発生した場合、@Transactional を使用すると、操作全体がロールバックされます。

すべてが期待どおりに機能することを確認するには、DAO をアプリケーション コードにさらに近づける必要があります。たとえば、オブジェクトが返されたかどうかを確認できます。(null の場合 - そうでない場合) 例外をキャッチしてログに記録し、何か問題が発生してトランザクションが機能しなかったことをユーザーに通知することもできます。

そのため、この時点で、私はまだ考えています-トランザクションに応じて、結果を処理できる場合はすべて問題ありません-そうでない場合は、ユーザーに通知できます。

結果を返すトランザクションが指定されていない場合は、try/catch を使用して HibernateException をキャッチできます。しかし、トランザクションはまだロールバックされていますか? HibernateException をキャッチすると、トランザクションのロールバックが回避されると思いました。私はまだ何をすべきかわかりません。:-(

残念ながら、これに加えて、MVC 例外処理 (@ExceptionHandler) がこれと関係があることを理解していません。処理された例外の表がありましたが、HibernateException が見つかりませんでした。または、これでうまくいくと思いますか: @ExceptionHandler(HibernateException.classs)? また、この方法で例外を処理することはお勧めしないと言っていました。

于 2011-03-21T16:30:42.917 に答える