【发布时间】:2021-08-19 07:49:41
【问题描述】:
我们正在从 Spring WebInitializer 迁移到 Spring boot 2.5.0 SpringBootServletInitializer
我们需要为我们的 Servlet 调度器添加一个上下文路径,代码如下:
@SpringBootApplication(exclude = { JmsAutoConfiguration.class, ActiveMQAutoConfiguration.class,
SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class })
public class WebServerConfig extends SpringBootServletInitializer implements ApplicationContextAware {
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> webServerFactoryCustomizer() {
return factory -> {
factory.setRegisterDefaultServlet(true);
factory.setContextPath("/servlet");
};
}
}
在运行 Maven WAR 常规 Tomcat 8.5 时,未设置 Servlet 上下文,记录:
o.a.c.c.C.[Catalina].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
普通主线
public static void main(String[] args) {
SpringApplication.run(WebServerConfig.class, args);
}
当运行嵌入式 Tomcat 代码按预期工作时:
o.a.c.c.C.[.[localhost].[/servlet] : Initializing Spring DispatcherServlet 'dispatcherServlet'
Maven pom:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${springframework.boot-version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>${springframework.boot-version}</version>
<scope>provided</scope>
</dependency>
我也有configure方法:
@Override
protected SpringApplicationBuilder configure(
SpringApplicationBuilder builder) {
return builder.sources(WebServerConfig.class);
}
在构建 WAR 时是否缺少启用 Servlet 上下文的代码/属性?
【问题讨论】:
-
您需要覆盖/实现
SpringBootServletInitializer的configure方法,否则它不会做任何事情。 -
@M.Deinum 我还在我的问题中添加了
configure方法 -
从那些 sn-ps 无法分辨,而且您的配置看起来也很奇怪。另外取决于您的 Spring Boot 版本,Tomcat 8.5 可能太低,您需要 Tomcat 9。
-
当然
WebServerFactoryCustomizer在部署为war 文件时不适用。那是为了控制嵌入式tomcat的创建,spring Boot无法控制外部tomcat。所以不会设置上下文路径(与 servletcontext 不同(让我失望))。 -
@M.Deinum 与 tomcat 9 相同的结果,那么相当于 Spring
ServletRegistration.Dynamic dispatcher = servletContext.addServlet("Mydispatcher", ds); dispatcher.addMapping("/servlet/*");
标签: java spring spring-boot maven