【问题标题】:How to handle JSON Parse Error in Spring Rest Web Service如何处理 Spring Rest Web 服务中的 JSON 解析错误
【发布时间】: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 

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

【问题讨论】:

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


    【解决方案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)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-13
      • 2015-08-17
      • 1970-01-01
      • 2014-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多