如何处理Spring Rest Web Service中的JSON解析错误

时间:2017-06-30 16:00:31

标签: json spring rest spring-mvc spring-boot

我有一个使用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 

我想知道是否有一种方法可以为此异常提供客户端自定义异常消息。我不知道如何处理这个错误。

2 个答案:

答案 0 :(得分:10)

要为每个控制器自定义此消息,请在控制器中使用@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...
    }
}

答案 1 :(得分:0)

您还可以扩展 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)
}