将上下文路径添加到Spring Boot应用程序


174

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

这是Web应用程序的应用程序配置文件。

@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在请求映射之前不附加上下文根的问题?

Answers:


381

您为什么要推出自己的解决方案。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.contextPath=/mainstay

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

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

另请参见《参考指南》,尤其是“ 属性”部分。

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


尽管您的答案是正确的(我的意思是,您可以通过应用程序属性文件自定义servlet容器属性),但为什么会有setContextPath(path)方法,我的意思是,如果不强制执行该路径,这有什么用?顺便说一句,EmbeddedServletContainerCustomizer上的setContextPath(...)也是如此
Modi,2014年

2
我希望from EmbeddedServletContainerCustomizer也能起作用。但我会选择提供的内容,而不是尝试自己动手。为什么您的解决方案不起作用与设置中的默认行为(偶然地?)有关ServerProperties,默认配置contextPath""(并且检查是否null存在""。后者会覆盖您的显式设置contextPath。)
M. Deinum 2014年

属性已更改,请参阅下面的答案。
Michael Simons

5
我猜想Spring Boot 2.0中的属性是“ server.servlet.context-path”
IamVickyAV,

34

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

相反,如果一种功能可用于基本配置,则可以在名为的“属性”文件中进行设置,该文件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


22

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

server.servlet.context-path

2
这对于部署在外部tomcat中的war文件不起作用
pise

1
对我来说,这没有用(Spring Boot 2.1.2),但是这样做了:server.servlet.contextPath=/api
有用 lospejos

2
@pise,您知道如何为外部tomcat中的war文件修复它吗?
mohax

11

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

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


有没有人想出如何在war使用springboot v2.x和部署为外部tomcat 文件时配置此配置tomcat v8.5
Simple-Solution18年

@abdel甚至我都在寻找答案,如果我们在外部tomcat中部署war文件怎么设置上下文路径。
pise

我正在尝试。就像上面链接中所说的一样。将build-> finalName属性值更改为上下文路径。然后,生成的war文件将使用上下文路径作为文件名,然后,tomcat将使用它作为上下文路径。
DriLLFreAK100

我可以想到的在外部tomcat中部署战争的唯一方法是确保战争名称与您所追求的上下文匹配。因此,例如,如果您希望上下文为“ / xyzwebapp”,则您的战争必须命名为xyzwebapp.war。为此,可以将以下内容添加到pom.xml中的<build>元素中:<finalName> xyzwebapp </ finalName>。
abdel


2

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

application.properties

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

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

1

我们可以将其设置application.propertiesAPI_CONTEXT_ROOT=/therootpath

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

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

1

server.contextPath = / mainstay

如果我在JBOSS中有一份战争档案,对我有用。在多个每个都包含jboss-web.xml的war文件中,它不起作用。我必须将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>


1

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

application.porperties文件配置

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 

我们还可以通过编程方式添加服务器端口
Ghulam Murtaza


0

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

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

0

如果您使用Spring Boot 2.x,并希望在命令行中传递上下文路径属性,则应像这样放置double //:

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

这对我在Windows中运行非常有用。


0
<!-- Server port-->

server.port=8080

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

server.servlet.context-path=/ems

服务器端口将为8080。如果需要任何其他端口,则可以替换8080。为应用程序上下文路径设置了ems。您可以根据自己的需要设置其他路径
Bordoloi Parth

1
那是有用的信息,为什么不将其添加到答案中而不是添加评论?
k-den

0

它必须是:server.servlet.context-path = / demo请注意,它没有仅用引号'/'引起来的引号,此值在您的application.properties文件中


-1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.