【问题标题】:Add context path to Spring Boot application将上下文路径添加到 Spring Boot 应用程序
【发布时间】:2013-12-22 17:12:05
【问题描述】:

我正在尝试以编程方式设置 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 在请求映射之前不附加上下文根?

【问题讨论】:

    标签: java spring spring-mvc spring-boot


    【解决方案1】:

    您为什么要尝试推出自己的解决方案。 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) 来覆盖它们。

    另请参阅The Reference Guide,尤其是properties 部分。

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

    【讨论】:

    • 虽然你的答案是正确的(我的意思是,你可以通过应用程序属性文件自定义servlet容器属性),为什么会有一个setContextPath(path)方法,我的意思是,如果路径不是强制执行,有什么用?顺便说一句,EmbeddedServletContainerCustomizer 上的 setContextPath(...) 也是如此
    • 我希望来自EmbeddedServletContainerCustomizer 的那个也可以工作。但是我会去提供所提供的东西,而不是尝试自己动手。为什么您的解决方案不起作用与ServerProperties 中编程的默认行为(意外?)有关,默认配置的contextPath""(它检查null 而不是""。后者覆盖您明确设置的contextPath
    • 属性变了,下面看我的回答。
    • 我猜Spring Boot 2.0中的属性是“server.servlet.context-path”
    • 可能对某人有帮助:对于工作的上下文路径,spring boot 项目必须是一个 web 项目。 spring-boot-starter-web 必须添加为依赖项
    【解决方案2】:

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

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

    1. .yml

    2. .properties

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

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

    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

    【讨论】:

      【解决方案3】:

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

      server.servlet.context-path
      

      【讨论】:

      • 这不适用于部署在外部 tomcat 中的战争文件
      • 对我来说这不起作用(Spring Boot 2.1.2),但确实起作用了:server.servlet.contextPath=/api
      • @pise,你知道如何修复外部 tomcat 中的战争文件吗?
      • @mohax 如果将 WAR 文件部署到外部 tomcat,则必须将 WAR 文件重命名为 ROOT.war 以使事情按预期工作。
      • @DucLe 在我的情况下,我只是将战争文件重命名为所需的路径。 IE。 servicename#api,其中# 被tomcat 替换为/
      【解决方案4】:

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

      在此处查看此答案:https://stackoverflow.com/a/43856300/4449859

      【讨论】:

      • 在使用springboot v2.xtomcat v8.5war 文件部署到外部tomcat 时,有没有人知道如何配置它?
      • @abdel 即使我在寻找答案,如果我们在外部 tomcat 中部署 war 文件如何设置上下文路径。
      • 我正在尝试。这与上面链接中所说的完全一样。将 build -> finalName 属性值更改为您的上下文路径。然后生成的war文件将使用上下文路径作为文件名,然后tomcat将使用该文件名作为上下文路径。
      • 我能想到的在外部 tomcat 中部署为战争的唯一方法是确保战争名称与您所追求的上下文相匹配。例如,如果您希望上下文为“/xyzwebapp”,那么您的战争必须命名为 xyzwebapp.war。为此,您可以将以下内容添加到 pom.xml 中的 元素:xyzwebapp.
      【解决方案5】:

      正确的属性是

      server.servlet.path
      

      配置DispatcherServlet的路径

      server.servlet.context-path
      

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

      【讨论】:

        【解决方案6】:

        您可以通过添加端口和上下文路径轻松地在 [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 
        

        【讨论】:

        • 我们也可以通过编程方式添加服务器端口
        【解决方案7】:

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

        application.properties

        ### Spring boot 1.x #########
        server.contextPath=/ClientApp
        
        ### Spring boot 2.x #########
        server.servlet.context-path=/ClientApp
        

        【讨论】:

          【解决方案8】:

          我们可以在application.properties 中设置为 API_CONTEXT_ROOT=/therootpath

          我们在下面提到的Java类中访问它

          @Value("${API_CONTEXT_ROOT}")
          private String contextRoot;
          

          【讨论】:

            【解决方案9】:

            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>
            

            【讨论】:

            • 它不适用于 Wildfly23。有什么想法吗?
            【解决方案10】:

            在 Spring Boot 1.5 中:

            application.properties中添加以下属性:

            server.context-path=/demo
            

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

            【讨论】:

              【解决方案11】:

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

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

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

              【讨论】:

                【解决方案12】:

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

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

                【讨论】:

                  【解决方案13】:

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

                  server:
                     context-path: abc    
                  

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

                  server:
                    servlet:
                      context-path: abc
                  

                  【讨论】:

                    【解决方案14】:

                    如果你使用的是application.yml和spring 2.0以上的版本,那么按照下面的方式进行配置。

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

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

                    【讨论】:

                      【解决方案15】:

                      我们可以使用WebServerFactoryCustomizer 来设置它。这可以直接添加到启动Spring ApplicationContext的spring boot main方法类中。

                      @Bean
                          public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>
                            webServerFactoryCustomizer() {
                              return factory -> factory.setContextPath("/demo");
                      }
                      

                      【讨论】:

                        【解决方案16】:
                        <!-- Server port-->
                        
                        server.port=8080
                        
                        <!--Context Path of the Application-->
                        
                        server.servlet.context-path=/ems
                        

                        【讨论】:

                        • 服务器端口将是 8080。如果你想要任何其他端口,你可以替换 8080。从应用程序上下文路径我已经设置了 ems。您可以根据需要设置其他路径
                        • 这是有用的信息,为什么不将其添加到您的答案中而不是评论中?
                        【解决方案17】:

                        它必须是: server.servlet.context-path = / 演示 请注意,它没有引号,只有以 '/' 开头的值 这个值在你的 application.properties 文件中

                        【讨论】:

                          【解决方案18】:

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

                          spring:
                            webflux:
                              base-path: /api
                          

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

                          【讨论】:

                            【解决方案19】:

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

                            【讨论】:

                              猜你喜欢
                              • 1970-01-01
                              • 2021-10-10
                              • 2018-05-06
                              • 2021-08-10
                              • 2011-04-23
                              • 1970-01-01
                              • 2020-05-07
                              • 2013-04-12
                              相关资源
                              最近更新 更多