将 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 2.3.5 升级到 2.4.0

将 Spring Boot 1.5.10 升级到 2.1.11

在 Spring Boot 应用程序中将 mongo db 升级到 3.2

Spring Boot 版本从 2.1.6 升级到 2.2.1 和 spring-cloud 问题

升级到 Spring Boot 2.2.2 后应用程序启动缓慢

将 Spring Boot 升级到 2.4.1