web-dev-qa-db-ja.com

Spring Rest APIで内部サーバーエラー(500)を処理する方法は?

良い一日、

私は春休みのAPIに取り組んでおり、すべてがうまく機能していることを確認したいと思います。 nullPointerExceptionやデータベース接続エラーなどの異常な動作、または発生し、処理されない、または想定されない例外をログに記録したいと思います。

未処理の例外をキャッチし、スタックトレースを出力する代わりに、美しいメッセージをユーザーに表示したいと思います。

このために、ResponseEntityExceptionHandlerを拡張し、handleExceptionInternalメソッドをオーバーライドするインターネット上のソリューションを見つけました。

また、404エラーをログに記録して、誰かが自分のサーバーを攻撃しようとしているかどうかを確認します。

プロパティファイルにも次の行を追加しました:sp​​ring.mvc.throw-exception-if-no-handler-found = true

ここにhandleExceptionInternalのコードがあります

@Override
protected ResponseEntity<Object> handleExceptionInternal(Exception ex, Object body, HttpHeaders headers, HttpStatus status, WebRequest request) {

    GenericResponse response = new GenericResponse();
    response.setMessage("Internal error occured, " + ex.getStackTrace()[0]);

    System.out.println("big exceptions");

    return new ResponseEntity(response, headers, status);

}

私の問題は、/ abcのような不正なルートを渡すとき、このコードは正常に動作していることですが、コントローラーメソッドからnullポインター例外をスローすると、このメソッドはキャッチしません。

ありがとう。

10
user3454581
@ControllerAdvice
public class Handler {

    @ExceptionHandler(Exception.class)
    public ResponseEntity<Object> handle(Exception ex, 
                HttpServletRequest request, HttpServletResponse response) {
        if (ex instanceof NullPointerException) {
            return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
        }
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
    }
}

ExceptionHandler Documenation-ここでは、メソッドシグネチャが操作できるすべてのオブジェクトを見つけることができます。

ControllerAdvice-追加のプロパティなしですべての例外を処理するため、予期しない動作を提供できます。 basePackagesプロパティにパッケージ(パッケージ)を提供する方が適切であり、指定されたパッケージでスローされた例外のみを処理します。

また、例外をカスタム@ExceptionHandlerマーク付きメソッドに分離することをお勧めします。これにより、ハンドラーロジックが分離されます。

8
Bogdan Oros