首页 > 解决方案 > Servlet 上下文不仅在构建 WAR 时设置

问题描述

我们正在从 Spring 迁移WebInitializer到 Spring boot 2.5.0SpringBootServletInitializer

我们需要为我们的 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 上下文的代码/属性?

除了使用不同的战争名称外,我发现较旧的问题问题 2没有真正的答案。

标签: javaspringspring-bootmaven

解决方案


使用以下应用程序属性设置 Spring Boot 应用程序的上下文路径。如果您使用的是 yaml 配置。

server:
   servlet:
     context-path: /servlet

如果您使用的是 application.properties

server.servlet.context-path = /servlet

推荐阅读