Springgboot内嵌Tomcat启动异常、接口报content-type错误求助
SpringBoot 2.0.5 内嵌Tomcat运行异常解决方案
1. 配置文件偶发读取失效、仅-D传参可正常启动问题
按以下顺序排查:
- 核对Tomcat依赖scope:war包外置部署时,通常会将
spring-boot-starter-tomcat依赖scope设为provided,避免和外置Tomcat包冲突。直接用spring-boot:run启动内嵌容器时,该scope会导致Tomcat相关类加载路径异常,连带配置文件扫描优先级错乱。临时调试内嵌启动时,注释掉该依赖的provided配置即可;如果要同时兼容两种部署方式,可通过Maven profile区分不同场景的依赖配置。
参考配置:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <!-- 外置Tomcat部署时打开以下配置,内嵌调试时注释 --> <!-- <scope>provided</scope> --> </dependency> - 核对启动类配置:war包部署的启动类会继承
SpringBootServletInitializer并重写configure方法,如果方法内未正确指定启动类源,内嵌启动时resources目录下的配置文件不会被加入classpath扫描路径。确保configure方法写法正确:@SpringBootApplication public class YourApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(YourApplication.class); } public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } } - 核对Maven资源过滤规则:检查pom.xml中
maven-resources-plugin的配置,如果exclude规则误排除了对应properties配置文件,spring-boot:run启动时配置文件不会被拷贝到target/classes目录,自然无法读取。执行mvn clean compile后检查target/classes目录下是否存在目标配置文件,不存在则调整资源过滤规则。 - 启动时加
--debug参数,查看日志中Config locations打印的配置扫描路径,确认配置文件所在目录是否在扫描列表中。
2. 接口调用返回invalid-content-type:text/html错误
该错误本质是请求未进入业务接口,被Tomcat默认错误页拦截,返回了HTML格式的错误响应,导致客户端按预期格式(SOAP XML/REST JSON)解析失败,按以下顺序排查:
- 核对上下文路径:外置Tomcat部署时,应用上下文路径默认和war包名一致,内嵌Tomcat默认上下文路径为
/。如果未在配置文件中指定和外置部署一致的上下文路径,请求会因路径不匹配返回404,触发HTML错误页。在配置文件中补全对应配置即可:server.servlet.context-path=/和之前外置部署一致的路径 - 核对Servlet映射规则:外置部署时如果在web.xml中自定义了DispatcherServlet、SOAP服务Servlet(如CXF、Spring-WS的MessageDispatcherServlet)的映射路径,内嵌启动时无web.xml配置,默认映射规则可能和之前不一致,导致请求找不到对应处理逻辑。REST接口可通过
spring.mvc.servlet.path配置指定DispatcherServlet映射路径,SOAP服务需显式注册对应Servlet的访问路径。 - 直接用浏览器访问目标接口地址,查看返回的HTML错误页中的错误码:
- 404:路径错误,重新核对上下文路径、接口映射地址
- 405:请求方法不匹配,比如POST接口误用GET调用
- 500:接口内部抛出异常,查看后端启动日志的异常栈定位问题
- 核对过滤器/拦截器加载顺序:外置Tomcat启动时过滤器按web.xml配置顺序加载,内嵌启动时过滤器加载顺序变化可能导致自定义权限、跨域过滤器提前拦截请求,跳转至HTML格式的错误提示页,逐个禁用自定义过滤器即可验证拦截逻辑。
内容的提问来源于stack exchange,提问作者Reddypeer shaik
相关产品推荐
相关产品推荐

