如何在 Spring 中捕获大量 Jackson 异常?

Posted

技术标签:

【中文标题】如何在 Spring 中捕获大量 Jackson 异常?【英文标题】:How to catch a lot of Jackson Exceptions in Spring? 【发布时间】:2019-04-17 13:01:06 【问题描述】:

我有一个使用 ControllerAdviceExceptionHandlers 的 Spring Boot REST 应用程序。我使用Jackson 作为我的序列化/反序列化。我使用PostMan 作为我的客户端,当我发送不同的错误(如无效输入、错误的 JSON 语法等)时......杰克逊抛出了某些异常。目前,我有一个 (1) ExceptionHandler,它明确声明了每种类型的异常,例如 MismatchedInputExceptionInvalidFormatExceptionInvalidDentinitionException...这些都是 JsonProcsessingException 的形式。

有没有办法只捕获JsonProcessingException 及其所有孩子?我根据异常的类型返回不同的消息/状态代码。因此,如果引发与序列化相关的异常,我希望发回某个错误消息。

【问题讨论】:

你有没有遇到过上面提到的一个异常?据我了解,spring 会用一些 spring 特定的例外来包装它。如果您只想捕获异常及其子异常,那么您只需捕获父异常即可捕获所有异常。 你能展示你的代码吗? @Jaiwo99 同意。已解决 [org.springframework.http.converter.HttpMessageNotReadableException:JSON 解析错误:无法从字符串“ee”反序列化 java.lang.Integer 类型的值:不是有效的整数值;嵌套异常是 com.fasterxml.jackson.databind.exc.InvalidFormatException:无法从字符串“ee”反序列化类型为 java.lang.Integer 的值:不是 [Source: (PushbackInputStream) 处的有效整数值;行:8,列:23](通过引用链: 【参考方案1】:

您应该在@ControllerAdvice 类中创建此方法并验证您要管理哪些异常以返回不同的消息/状态代码。

@ExceptionHandler(InvalidFormatException.class, MismatchedInputException.class)
public void handlerIllegalArgumentException(JsonProcessingException exception,
                                            ServletWebRequest webRequest) throws IOException 
    if(exception instanceof InvalidFormatException) 
        LOGGER.error(exception.getMessage(), exception);
        webRequest.getResponse().sendError(HttpStatus.CONFLICT.value(), exception.getMessage());
     else if (exception instanceof MismatchedInputException) 
        LOGGER.error(exception.getMessage(), exception);
        webRequest.getResponse().sendError(HttpStatus.BAD_REQUEST.value(), exception.getMessage());
    

【讨论】:

像魅力一样工作谢谢。顺便说一句,这也解决了 Kotlin 的问题,只需使用:@ExceptionHandler(MissingKotlinParameterException::class) @DominikK 太棒了! :) 你可以在 *** 上关注我的个人资料,亲切的问候......

以上是关于如何在 Spring 中捕获大量 Jackson 异常?的主要内容,如果未能解决你的问题,请参考以下文章

Jersey/Jackson:如何捕获 json 映射异常?

如何在 Spring Boot 1.4 中自定义 Jackson

如何在 Spring Boot REST API 中启用对 JSON / Jackson @RequestBody 的严格验证?

在 Jackson VirtualBeanPropertyWriter 中注入 Spring Bean

如何在spring boot应用程序中配置Jackson而不覆盖纯java中的springs默认设置

您如何全局设置 Jackson 以忽略 Spring 中的未知属性?