Spring Boot 2 REST API部署独立Tomcat 8.5响应截断至8KB问题
解决Spring Boot WAR包部署到Tomcat 8.5后响应被截断8KB的问题
兄弟,我之前也踩过这个坑!这事儿大概率是独立Tomcat的默认配置在搞鬼,跟你慢慢说:
问题根源
Spring Boot自带的嵌入式Tomcat,默认把maxSwallowSize参数设成了-1(也就是不限制响应大小),所以你本地用bootRun跑的时候啥事没有。但Tomcat 8.5的独立版默认NIO连接器的maxSwallowSize是8192字节(刚好8KB),当你的接口返回的响应数据超过这个阈值,Tomcat就会直接截断内容,导致你拿到不完整的响应。
两种解决办法
方法1:修改Tomcat全局配置(简单直接)
找到你Tomcat安装目录下的conf/server.xml,找到NIO连接器的<Connector>标签(一般protocol属性是org.apache.coyote.http11.Http11NioProtocol),加上maxSwallowSize="-1":
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8443" maxSwallowSize="-1"/>
改完重启Tomcat就生效了,不过这个配置会影响Tomcat上所有的应用。
方法2:在Spring Boot项目里自定义配置(只影响你的应用)
如果不想动Tomcat全局配置,可以在你的Spring Boot项目里加个配置类,专门给部署的Tomcat设置参数:
import org.apache.catalina.connector.Connector; import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.boot.web.servlet.server.ServletWebServerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class TomcatCustomConfig { @Bean public ServletWebServerFactory servletWebServerFactory() { TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(); factory.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> { // 禁用响应大小限制 connector.setMaxSwallowSize(-1); }); return factory; } }
把这个类加到你的项目里,重新打包WAR部署就OK了,这个配置只会对你的应用生效,不影响其他应用。
额外检查点
别忘了确认下你的ResultData里的data确实生成了超过8KB的内容,排除是代码逻辑导致数据本身不完整的情况哦!
内容的提问来源于stack exchange,提问作者lbednaszynski




