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
この例外のために、クライアントにカスタム例外メッセージを提供できる方法があることを知りたかったのです。このエラーの処理方法がわかりません。
コントローラごとにこのメッセージをカスタマイズするには、コントローラ内で@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...
}
}
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)
}