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

Posted

技术标签:

【中文标题】如何处理 Spring Rest Web 服务中的 JSON 解析错误【英文标题】:How to handle JSON Parse Error in Spring Rest Web Service 【发布时间】:2017-12-04 15:50:57 【问题描述】:

我有一个使用 Spring Boot 开发的 REST Web 服务。我能够处理由于我的代码而发生的所有异常,但假设客户端发布的 json 对象与我想要反序列化的对象不兼容有了,我得到了

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

如果您不知道是什么原因导致的异常,您如何处理? handleException 方法不接收异常或任何其他参数。 -- 编辑:好吧,那是个愚蠢的问题……你可以给它添加参数,比如异常本身,Spring会像往常一样施展魔法。 如果有一个示例参数,答案会更好` @ResponseStatus(value = HttpStatus.BAD_REQUEST, reason = "CUSTOM MESSAGE HERE") @ExceptionHandler(HttpMessageNotReadableException.class) public void handleException(HttpMessageNotReadableException e) e.printStackTrace(); `【参考方案2】:

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

【讨论】:

以上是关于如何处理 Spring Rest Web 服务中的 JSON 解析错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 KissXML 处理 wcf Rest Web 服务 - 我应该如何处理命名空间问题

如何处理 Spring Rest API 上的内部服务器错误(500)以自定义消息?

Spring Data REST CORS - 如何处理预检选项请求?

如何处理 grails spring-security-rest 插件中的自定义身份验证异常?

如何处理 Spring Boot Rest 和 Jackson Deserializer 的 Javax 验证中的无效数字

您如何处理 REST API 服务器中的高吞吐量函数?