Java Servlet上下文不是';不要只在发动战争时才设定目标

Java Servlet上下文不是';不要只在发动战争时才设定目标,java,spring,spring-boot,maven,Java,Spring,Spring Boot,Maven,我们正在从SpringWebInitializer转移到SpringBoot2.5.0SpringBootServletilizer 我们需要为Servlet调度器添加上下文路径,代码如下: @SpringBootApplication(exclude = { JmsAutoConfiguration.class, ActiveMQAutoConfiguration.class, SecurityAutoConfiguration.class, ManagementWeb

我们正在从Spring
WebInitializer
转移到SpringBoot2.5.0
SpringBootServletilizer

我们需要为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");
       };
   }
}
普通干管

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:


org.springframework.boot

除了使用不同的war名称之外,没有真正的答案。

使用下面的应用程序属性为spring boot应用程序设置上下文路径。 如果您使用的是yaml配置

server:
   servlet:
     context-path: /servlet
如果您使用的是application.properties

server.servlet.context-path = /servlet

使用下面的应用程序属性设置spring引导应用程序的上下文路径。 如果您使用的是yaml配置

server:
   servlet:
     context-path: /servlet
如果您使用的是application.properties

server.servlet.context-path = /servlet

我们通过在SpringApplicationBuilder中添加属性解决了这个问题:

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
    Properties bootProperties = new Properties();
    bootProperties.setProperty("spring.mvc.servlet.path", "/servlet");
    return builder.sources(WebServerConfig.class).properties(bootProperties);
}

我们通过在SpringApplicationBuilder中添加属性解决了这个问题:

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
    Properties bootProperties = new Properties();
    bootProperties.setProperty("spring.mvc.servlet.path", "/servlet");
    return builder.sources(WebServerConfig.class).properties(bootProperties);
}


您需要重写/实现
SpringBootServletInitializer
configure
方法,否则它不会做任何事情。@M.Deinum我还将
configure
方法添加到我的问题中,从这些片段中不可能看出,您的配置看起来也很奇怪。另外,根据您的Spring启动版本,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/*”)
您需要重写/实现
SpringBootServletInitializer
configure
方法,否则它不会做任何事情。@M.Deinum我还将
configure
方法添加到我的问题中,从这些片段中不可能看出,而且您的配置看起来也很奇怪。另外,根据您的Spring启动版本,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/*”)它只影响嵌入式tomcat,而不影响部署war时您的war文件名将是第一个上下文路径示例application.war然后您的上下文路径将是host:port/applicationon/contextpathInProperty/controllermappingpath。将war名称命名为root conext path我使用root,因此我的文件名为root.war是否要在war中或根路径之后更改根上下文?听起来是一样的,我正在构建spring boot应用程序并部署到war,我需要/servlet作为上下文路径,尽管我的war是ROOT.warIt只影响嵌入式tomcat,而不影响部署war时您的war文件名将是第一个上下文路径示例应用程序。war然后您的上下文路径将是host:port/applicationon/contextpathInProperty/ControllerMappingPath。将war名称命名为root conext path我使用root,所以我的文件名是root.war你想在war中或根路径之后更改根上下文吗?听起来是一样的,我正在构建spring boot应用程序并部署到war,我需要/servlet作为上下文路径,尽管我的war是root.war