【问题标题】:SpringBoot - HttpMessageNotReadableException: JSON parse error: java.net.SocketTimeoutExceptionSpringBoot - HttpMessageNotReadableException:JSON 解析错误:java.net.SocketTimeoutException
【发布时间】:2020-04-27 12:36:51
【问题描述】:

我的代码抛出异常如下

JSON parse error: java.net.SocketTimeoutException; nested exception is com.fasterxml.jackson.databind.JsonMappingException: java.net.SocketTimeoutException (through reference chain: java.util.ArrayList[9])
org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: java.net.SocketTimeoutException; nested exception is com.fasterxml.jackson.databind.JsonMappingException: java.net.SocketTimeoutException (through reference chain: java.util.ArrayList[9])
        at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:245) ~[spring-web-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
        at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:227) ~[spring-web-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
        at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:204) ~[spring-webmvc-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
        at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:157) ~[spring-webmvc-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
        at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:130) ~[spring-webmvc-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
        at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:127) ~[spring-web-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
        at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:167) ~[spring-web-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
        at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:134) ~[spring-web-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
        at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) ~[spring-webmvc-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:892) ~[spring-webmvc-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797) ~[spring-webmvc-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
        at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1039) [spring-webmvc-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]

我的 spring-boot 版本是 2.1.7.RELEASE 并且嵌入式 tomcat 用于运行应用程序。 我还设置了属性server.connection-timeout=30s

我几乎到处搜索,无法确定这个问题的根本原因。我也捕捉到了这个异常并将其打印在日志中并将响应返回为 BAD_REQUEST。

此异常间歇性抛出,此时我的生产服务器消耗了 80% 以上的 CPU 和内存。

这实际上是一个POST请求,请求体验证如下

    @RequestMapping( value = "/save", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE )
    public SaveDto create( @RequestBody @Valid SaveDto saveDto,
        HttpServletResponse response, HttpServletRequest request )
    {
      //my logic
    }

我的SaveDto如下

@JsonInclude( JsonInclude.Include.NON_NULL )
public class SaveDto
{
    private String id;
    @Size( min = 1 )
    @Valid
    private List< SaveEntryDto > saveLogEntries;
}

我的saveEntryDto如下

public class SaveEntryDto implements Comparable<SaveEntryDto> {
    private String id;
    private String idRef;
    private WER wer;
    @Min(0)
    @Max(1440)
    private Integer kjh;
    @Min(0)
    @Max(1440)
    private Integer gfd;
    private String abc;
    private Double def;
    private String ghi;
    private Boolean klm = Boolean.FALSE;
    private Boolean hug;
    private Boolean qwe;
    private Double azx;
    private Double xds;
    private Boolean cvf = Boolean.FALSE;
    private Boolean bgh = Boolean.FALSE;
    private String nmj;
    private Boolean rgh;
    private Boolean jkh;
    private Boolean mkl = Boolean.FALSE;
    private Boolean wed = Boolean.FALSE;
    private Long ftu;
    private XYZ xyzxd;
    private String klp;
    private ABC xxz;
    private Boolean llo;
    private Long iop;
    private Double poi;
    private Boolean uyt = Boolean.FALSE;
    private Boolean rew = Boolean.FALSE;
    private String qsd;
}

【问题讨论】:

  • 您发送到此端点的有效负载有多大?
  • 您能否确认在您的依赖项中引入的嵌入式 tomcat 版本是什么?我相信它应该是 9.0.31。我遇到了类似的情况,发现 tomcat 9.0.31 有一个导致它的调试。这是链接apache_bug_link。该错误已在 9.0.33 版本中修复。它对我有用,你可以试试吗?
  • @P.J.Meisch 对有效负载没有限制。添加一些改进的日志后,我们可以看到大部分请求有时会抛出这个异常。即使是非常小的有效载荷处理 api。
  • @aks 我会尝试更新版本并通知您
  • @aks 我的版本是 9.0.22

标签: java spring-boot embedded-tomcat


【解决方案1】:

尝试使用server.tomcat.connection-timeout 而不是server.connection-timeout。出于某种原因,很多人提到了server.connection-timeout,但我认为它没有任何作用(根据https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html)。

server.tomcat.connection-timeout=30000 - 这会将超时设置为 30 秒

【讨论】:

    猜你喜欢
    • 2020-12-14
    • 1970-01-01
    • 2021-11-05
    • 2018-07-20
    • 1970-01-01
    • 2023-03-20
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多