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

Cor*_*eyS 148 java spring spring-mvc spring-boot

我试图以编程方式设置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;
  }
}
Run Code Online (Sandbox Code Playgroud)

这是主页面的索引控制器.

@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";
  }

}
Run Code Online (Sandbox Code Playgroud)

应用程序的新根应该在localhost:12378/mainstay,但它仍然位于localhost:12378.

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

M. *_*num 347

你为什么要尝试推出自己的解决方案.Spring-boot已经支持了.

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

server.contextPath=/mainstay
server.port=12378
Run Code Online (Sandbox Code Playgroud)

更新(Spring Boot 2.0)

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

server.servlet.contextPath=/mainstay
Run Code Online (Sandbox Code Playgroud)

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

基本上,application.properties作为默认服务器内部的属性,您始终可以通过使用application.properties您提供的工件旁边的其他属性或通过添加JVM参数(-Dserver.port=6666)来覆盖它们.

另请参见参考指南,尤其是属性部分.

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

  • 我猜Spring Boot 2.0中的属性是"server.servlet.context-path" (3认同)
  • 我希望来自 `EmbeddedServletContainerCustomizer` 的那个也能工作。但我会去提供什么,而不是试图自己搞定。为什么您的解决方案不起作用与`ServerProperties`中编程的默认行为(意外?)有关,默认配置的`contextPath`是`""`(并且它检查`null`而不是`""` . 后者覆盖了您明确设置的 `contextPath`。 (2认同)

Abh*_*hah 28

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

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

  1. .yml

  2. .properties

指定或设置配置的方式因格式而异.

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

server.port = 8080
server.contextPath = /context-path
Run Code Online (Sandbox Code Playgroud)

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

server:
    port: 8080
    contextPath: /context-path
Run Code Online (Sandbox Code Playgroud)

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

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


mag*_*llo 18

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

server.servlet.context-path
Run Code Online (Sandbox Code Playgroud)

  • 这不适用于部署在外部 tomcat 中的战争文件 (2认同)
  • @pise,你知道如何修复外部tomcat中的war文件吗? (2认同)

abd*_*del 9

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

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


Mic*_*ons 7

正确的属性是

server.servlet.path
Run Code Online (Sandbox Code Playgroud)

配置DispatcherServlet的路径

server.servlet.context-path
Run Code Online (Sandbox Code Playgroud)

在下面配置应用程序上下文的路径.


Tra*_*ace 6

如果您使用 spring-boot-starter-webflux 使用:

spring:
  webflux:
    base-path: /api
Run Code Online (Sandbox Code Playgroud)

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


Ghu*_*aza 5

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

application.porterties 文件配置

server.port = 8084
server.contextPath = /context-path
Run Code Online (Sandbox Code Playgroud)

application.yml 文件配置

server:
port: 8084
contextPath: /context-path
Run Code Online (Sandbox Code Playgroud)

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

@Component
public class ServerPortCustomizer implements     WebServerFactoryCustomizer<EmbeddedServletContainerCustomizer > {

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

}

我们还可以添加另一种方式

@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);
    }       
}
Run Code Online (Sandbox Code Playgroud)

使用java命令spring boot 1.X

java -jar my-app.jar --server.contextPath=/spring-boot-app     --server.port=8585 
Run Code Online (Sandbox Code Playgroud)

使用java命令spring boot 2.X

java -jar my-app.jar --server.servlet.context-path=/spring-boot-app --server.port=8585 
Run Code Online (Sandbox Code Playgroud)


Swa*_*ade 5

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

server:
  port: 8081
  servlet:
     context-path: /demo-api
Run Code Online (Sandbox Code Playgroud)

现在所有 API 调用都将类似于 http://localhost:8081/demo-api/