我的代码抛出了一个异常,如下所示
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来运行应用程序。
我几乎找遍了所有的地方都找不到这个问题的根本原因。我也捕捉到了这个异常,并将它打印在日志中,并将响应作为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;
}
2条答案
按热度按时间jpfvwuh41#
尝试使用
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 sdrnojrws2#
在我的情况下,这是由于从我的本地主机到服务器的网络速度慢,它是固定的,当我从另一个服务器发送请求。