将 Web 应用升级到 Spring Boot 2.4 后出现 IllegalStateException
Posted
技术标签:
【中文标题】将 Web 应用升级到 Spring Boot 2.4 后出现 IllegalStateException【英文标题】:IllegalStateException after upgrading web app to Spring Boot 2.4 【发布时间】:2021-02-25 12:58:03 【问题描述】:升级到 Spring Boot 2.4 后,我的 Web 应用程序不再启动。它抛出以下错误:
Unable to locate the default servlet for serving static content. Please set the 'defaultServletName' property explicitly.
我正在使用以下代码来更改上下文路径,我的研究指出这是“罪魁祸首”(更改上下文路径):
@Bean
public ServletWebServerFactory servletContainer()
String tomcatPort = environment.getProperty("tomcatPort");
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
tomcat.setPort(tomcatPort != null ? Integer.parseInt(tomcatPort) : 8080);
tomcat.setContextPath("/Carbon");
tomcat.setBaseDirectory(new File(System.getenv("MDHIS3_HOME")));
setTomcatProtocol(tomcat);
return tomcat;
我有以下方法,我可以看到它可以用来传递一个 defaultServletName,但我不知道我应该传递什么值:
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer)
configurer.enable();
这在 Spring Boot 2.3.4 上运行良好。我在那里传递什么值?是主控制器的名字吗?
【问题讨论】:
【参考方案1】:作为described in the Spring Boot 2.4 release notes,内嵌Servlet容器提供的DefaultServlet
默认不再注册。如果您的应用程序需要它,就像您的应用程序一样,您可以通过将server.servlet.register-default-servlet
设置为true
来启用它。
或者,您可以使用WebServerFactoryCustomizer
bean 以编程方式对其进行配置:
@Bean
WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> enableDefaultServlet()
return (factory) -> factory.setRegisterDefaultServlet(true);
请注意,必须通过自定义程序应用配置,以便默认的基于属性的配置不会覆盖它。
【讨论】:
谢谢你,安迪,我以为我昨天晚上读了所有相关的东西,但我想已经晚了。这确实可以解决它,但是有没有办法以某种方式以编程方式完成它?试图减少我的 application.properties 文件中的属性数量。谢谢!TomcatServletWebServerFactory
上有一个你可以使用的 setter。我已经更新了我的答案。
编程方法不起作用,我只能通过属性解决这个错误
啊,是的。这是一个导致配置被覆盖的排序问题。我已经用更好的方法更新了答案。
是的,成功了!谢谢安迪,你们太棒了!感谢您提供出色的产品!以上是关于将 Web 应用升级到 Spring Boot 2.4 后出现 IllegalStateException的主要内容,如果未能解决你的问题,请参考以下文章
将 Spring Boot 1.5.10 升级到 2.1.11
在 Spring Boot 应用程序中将 mongo db 升级到 3.2
Spring Boot 版本从 2.1.6 升级到 2.2.1 和 spring-cloud 问题