web-dev-qa-db-ja.com

Spring Rest WebサービスでJSON解析エラーを処理する方法

Spring Bootで開発された残りのWebサービスがあります。コードが原因で発生するすべての例外を処理できますが、クライアントが投稿するjsonオブジェクトが、それをシリアル化解除するオブジェクトと互換性がないと仮定します。取得する

"timestamp": 1498834369591,
"status": 400,
"error": "Bad Request",
"exception": "org.springframework.http.converter.HttpMessageNotReadableException",
"message": "JSON parse error: Can not deserialize value 

この例外のために、クライアントにカスタム例外メッセージを提供できる方法があることを知りたかったのです。このエラーの処理方法がわかりません。

8
T Anna

コントローラごとにこのメッセージをカスタマイズするには、コントローラ内で@ExceptionHandler@ResponseStatusの組み合わせを使用します。

    @ResponseStatus(value = HttpStatus.BAD_REQUEST, reason = "CUSTOM MESSAGE HERE")
    @ExceptionHandler(HttpMessageNotReadableException.class)
    public void handleException() {
        //Handle Exception Here...
    }

これを一度定義し、これらの例外をグローバルに処理する場合は、@ControllerAdviceクラスを使用します。

@ControllerAdvice
public class CustomControllerAdvice {
    @ResponseStatus(value = HttpStatus.BAD_REQUEST, reason = "CUSTOM MESSAGE HERE")
    @ExceptionHandler(HttpMessageNotReadableException.class)
    public void handleException() {
        //Handle Exception Here...
    }
}
12
Kyle Anderson

ResponseEntityExceptionHandlerを拡張してメソッドhandleHttpMessageNotReadableをオーバーライドすることもできます(Kotlinの例ですが、Javaでもよく似ています)。

override fun handleHttpMessageNotReadable(ex: HttpMessageNotReadableException, headers: HttpHeaders, status: HttpStatus, request: WebRequest): ResponseEntity<Any> {
    val entity = ErrorResponse(status, ex.message ?: ex.localizedMessage, request)
    return this.handleExceptionInternal(ex, entity as Any?, headers, status, request)
}
0
jpadilladev