41

ジャージーでグローバル例外処理を行う方法はありますか?個々のリソースにtry/catchブロックがあり、すべての例外をサニタイズしてクライアントに送り返すメソッドを呼び出す代わりに、リソースが実際に呼び出される場所にこれを配置する方法があることを期待していました。これも可能ですか?もしそうなら、どのように?

代わりにsanitize(e)、Jerseyサーブレットに対してある種のJersey構成の例外をどこでスローしますか。

@GET
public Object getStuff() {
    try {
        doStuff();
    } catch (Exception e) {
        ExceptionHandler.sanitize(e);
    }
}

持っている:

@GET
public Object getStuff() throws Exception {
    doStuff();
}

例外は、インターセプトしてそこから呼び出すことができるものにスローされますsanitize(e)

これは実際には、すべてのジャージーリソースを単純化し、クライアントに戻る例外が常に何らかの理解可能な形式であることを保証するためのものです。

4

3 に答える 3

42

はい。JAX-RSにはExceptionMappersの概念があります。独自のExceptionMapperインターフェイスを作成して、例外を応答にマップできます。詳細については、https ://jersey.github.io/documentation/latest/representations.html#d0e6352を参照してください。

于 2012-06-08T21:46:16.783 に答える
5

javax.ws.rs.ext.ExceptionMapperはあなたの友達です。

ソース:https ://jersey.java.net/documentation/latest/representations.html#d0e6665

例:

@Provider
public class EntityNotFoundMapper implements ExceptionMapper<javax.persistence.EntityNotFoundException> {
  public Response toResponse(javax.persistence.EntityNotFoundException ex) {
    return Response.status(404).
      entity(ex.getMessage()).
      type("text/plain").
      build();
  }
}
于 2016-04-21T15:58:18.837 に答える
0

上記のすべての答えはまだ有効です。ただし、Spring Bootの最新バージョンでは、以下のいずれかのアプローチを検討してください。

アプローチ1:@ExceptionHandler-コントローラーのメソッドにこのアノテーションを付けます。

このアプローチの欠点は、各コントローラーでこのアノテーションを使用してメソッドを作成する必要があることです。

このソリューションを回避するには、すべてのコントローラーをベースコントローラーで拡張します(ベースコントローラーは@ExceptionHandlerで注釈が付けられたメソッドを持つことができます。ただし、常に可能であるとは限りません。

アプローチ2:

  • @ControllerAdviceでクラスにアノテーションを付け、@ExceptionHandlerでメソッドを定義します

  • これは、コントローラーベースの例外(アプローチ1を参照)に似ていますが、コントローラークラスが例外を処理していない場合に使用されます。このアプローチは、RestApiでの例外のグローバル処理に適しています

于 2020-01-21T01:49:36.797 に答える