216

我正在尝试以编程方式设置 Spring Boot 应用程序上下文根。上下文根的原因是我们希望应用程序可以从中访问localhost:port/{app_name}并将所有控制器路径附加到它。

这是 web-app 的应用程序配置文件。

@Configuration
public class ApplicationConfiguration {

  Logger logger = LoggerFactory.getLogger(ApplicationConfiguration.class);

  @Value("${mainstay.web.port:12378}")
  private String port;

  @Value("${mainstay.web.context:/mainstay}")
  private String context;

  private Set<ErrorPage> pageHandlers;

  @PostConstruct
  private void init(){
      pageHandlers = new HashSet<ErrorPage>();
      pageHandlers.add(new ErrorPage(HttpStatus.NOT_FOUND,"/notfound.html"));
      pageHandlers.add(new ErrorPage(HttpStatus.FORBIDDEN,"/forbidden.html"));
  }

  @Bean
  public EmbeddedServletContainerFactory servletContainer(){
      TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
      logger.info("Setting custom configuration for Mainstay:");
      logger.info("Setting port to {}",port);
      logger.info("Setting context to {}",context);
      factory.setPort(Integer.valueOf(port));
      factory.setContextPath(context);
      factory.setErrorPages(pageHandlers);
      return factory;
  }

  public String getPort() {
      return port;
  }

  public void setPort(String port) {
      this.port = port;
  }
}

这是主页的索引控制器。

@Controller
public class IndexController {

  Logger logger = LoggerFactory.getLogger(IndexController.class);

  @RequestMapping("/")
  public String index(Model model){
      logger.info("Setting index page title to Mainstay - Web");
      model.addAttribute("title","Mainstay - Web");
      return "index";
  }

}

应用程序的新根目录应位于localhost:12378/mainstay,但仍位于localhost:12378

我错过了什么导致 Spring Boot 在请求映射之前不附加上下文根?

4

19 回答 19

440

你为什么要推出自己的解决方案。Spring-boot 已经支持这一点。

如果您还没有,请将application.properties文件添加到src\main\resources. 在该属性文件中,添加 2 个属性:

server.contextPath=/mainstay
server.port=12378

更新(Spring Boot 2.0)

从 Spring Boot 2.0 开始(由于 Spring MVC 和 Spring WebFlux 的支持),contextPath已更改为以下内容:

server.servlet.context-path=/mainstay

然后,您可以删除自定义 servlet 容器的配置。如果您需要对容器进行一些后期处理,您可以将EmbeddedServletContainerCustomizer实现添加到您的配置中(例如添加错误页面)。

基本上,内部的属性application.properties作为默认值,您始终可以通过application.properties在您交付的工件旁边使用另一个属性或通过添加 JVM 参数 ( -Dserver.port=6666) 来覆盖它们。

另请参阅参考指南,尤其是属性部分。

该类ServerProperties实现了EmbeddedServletContainerCustomizer. 的默认contextPath值为""。在您的代码示例中,您contextPath直接在TomcatEmbeddedServletContainerFactory. 接下来,ServerProperties实例将处理此实例并将其从您的路径重置为"". (此行进行null检查,但默认情况下""它总是失败并将上下文设置为""并覆盖您的)。

于 2013-12-06T07:29:51.593 回答
37

如果您使用的是 Spring Boot,那么您不必通过 Bean 初始化来配置服务器属性。

相反,如果一项功能可用于基本配置,则可以在名为 的“属性”文件中进行设置,该文件application应位于src\main\resources您的应用程序结构中。“属性”文件有两种格式

  1. .yml

  2. .properties

您指定或设置配置的方式因一种格式而异。

在您的特定情况下,如果您决定使用扩展名.properties,那么您将拥有一个名为的文件application.propertiessrc\main\resources其中包含以下配置设置

server.port = 8080
server.contextPath = /context-path

OTOH,如果您决定使用.yml扩展名(即application.yml),则需要使用以下格式(即YAML)设置配置:

server:
    port: 8080
    contextPath: /context-path

有关 Spring Boot 的更多常见属性,请参阅以下链接:

https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

于 2016-02-09T14:34:31.840 回答
24

如果您使用 Spring Boot 2.0.0,请使用:

server.servlet.context-path
于 2017-05-13T12:16:26.887 回答
14

请注意,“server.context-path”或“server.servlet.context-path”[从 springboot 2.0.x 开始] 属性仅在您部署到嵌入式容器(例如嵌入式 tomcat)时才有效。例如,如果您将应用程序部署为外部 tomcat 的战争,这些属性将不起作用。

在这里看到这个答案:https ://stackoverflow.com/a/43856300/4449859

于 2018-08-02T14:47:59.500 回答
10

正确的属性是

server.servlet.path

配置 DispatcherServlet 的路径

server.servlet.context-path

在其下方配置应用程序上下文的路径。

于 2017-04-24T09:03:36.480 回答
3

您可以通过轻松添加端口和上下文路径来在 [src\main\resources] .properties 文件和 .yml 文件中添加配置

application.porterties 文件配置

server.port = 8084
server.contextPath = /context-path

application.yml 文件配置

server:
port: 8084
contextPath: /context-path

我们也可以在 Spring Boot 中以编程方式更改它。

@Component
public class ServerPortCustomizer implements     WebServerFactoryCustomizer<EmbeddedServletContainerCustomizer > {

@Override
public void customize(EmbeddedServletContainerCustomizer factory) {
    factory.setContextPath("/context-path");
    factory.setPort(8084);
}

}

我们还可以添加其他方式

@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {SpringApplication application =     new pringApplication(MyApplication.class);
    Map<String, Object> map = new HashMap<>();
    map.put("server.servlet.context-path", "/context-path");
    map.put("server.port", "808");
    application.setDefaultProperties(map);
    application.run(args);
    }       
}

使用java命令spring boot 1.X

java -jar my-app.jar --server.contextPath=/spring-boot-app     --server.port=8585 

使用java命令spring boot 2.X

java -jar my-app.jar --server.servlet.context-path=/spring-boot-app --server.port=8585 
于 2019-07-23T15:47:12.603 回答
2

我们可以使用属性文件中的一个简单条目来更改上下文根路径。

application.properties

### Spring boot 1.x #########
server.contextPath=/ClientApp

### Spring boot 2.x #########
server.servlet.context-path=/ClientApp
于 2020-01-03T12:31:16.437 回答
1

我们可以将它设置在application.propertiesas API_CONTEXT_ROOT=/therootpath

我们在Java类中访问它,如下所述

@Value("${API_CONTEXT_ROOT}")
private String contextRoot;
于 2016-12-09T10:47:41.543 回答
1

您可以在 Spring Boot: 2.1.6 中使用,如下所示:

server.servlet.context-path=/api-path
于 2020-07-26T15:53:12.883 回答
1

在 Spring Boot 1.5 中:

在 中添加以下属性application.properties

server.context-path=/demo

注意:/demo是您的上下文路径 URL。

于 2017-11-11T16:11:16.403 回答
1

如果你使用 Spring Boot 2.x 并且想在命令行中传递上下文路径属性,你应该像这样输入 double //:

--server.servlet.context-path=//your-path

这对我在 Windows 中运行很有用。

于 2020-03-10T21:13:36.673 回答
1

对于 Spring boot 2 以下版本,您需要使用以下代码

server:
   context-path: abc    

对于 Spring boot 2+ 版本,请使用以下代码

server:
  servlet:
    context-path: abc
于 2020-08-21T12:25:16.493 回答
1

server.contextPath=/mainstay

如果我在 JBOSS 中有一个战争文件,对我有用。在每个包含 jboss-web.xml 的多个战争文件中,它不起作用。我不得不把 jboss-web.xml 放在 WEB-INF 目录中,里面有内容

<?xml version="1.0" encoding="UTF-8"?>
<jboss-web xmlns="http://www.jboss.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee http://www.jboss.org/j2ee/schema/jboss-web_5_1.xsd">
    <context-root>mainstay</context-root>
</jboss-web>
于 2017-11-01T13:08:22.503 回答
1

我们可以使用WebServerFactoryCustomizer. 这可以直接添加到启动 Spring ApplicationContext 的 spring boot 主方法类中。

@Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>
      webServerFactoryCustomizer() {
        return factory -> factory.setContextPath("/demo");
}
于 2020-01-23T03:02:41.933 回答
1

如果您使用的是 application.yml 和 2.0 以上的 spring 版本,请按以下方式配置。

server:
  port: 8081
  servlet:
     context-path: /demo-api

现在所有的 API 调用都会像 http://localhost:8081/demo-api/

于 2019-11-06T12:18:54.070 回答
0
<!-- Server port-->

server.port=8080

<!--Context Path of the Application-->

server.servlet.context-path=/ems
于 2020-04-15T18:11:42.340 回答
0

它必须是: server.servlet.context-path = / demo 注意它没有引号只有'/'前面的值这个值进入你的application.properties文件

于 2020-04-25T23:37:27.560 回答
0

如果您使用的是 spring-boot-starter-webflux ,请使用:

spring:
  webflux:
    base-path: /api

我向上帝发誓……我每次都忘记这一点。

于 2021-05-13T08:39:27.557 回答
-1

上下文路径可以直接集成到代码中,但不可取,因为它不能重复使用,因此请在 application.properties 文件中写入 server.contextPath=/放置代码的文件夹的名称 contextPath = 放置的文件夹名称代码/注意:仔细观察斜线。

于 2017-11-10T13:12:23.343 回答