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

新手上路,请多包涵

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

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

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

原文由 CorreyS 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 594
2 个回答

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

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

 server.contextPath=/mainstay
server.port=12378

更新(春季引导 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 实现 EmbeddedServletContainerCustomizercontextPath 的默认值是 "" 。在您的代码示例中,您直接在 contextPath 上设置 TomcatEmbeddedServletContainerFactory 。接下来 ServerProperties 实例将处理此实例并将其从您的路径重置为 "" 。 ( 此行 执行 null 检查,但默认为 "" 它总是失败并将上下文设置为 "" 并因此覆盖你的)。

原文由 M. Deinum 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

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

  1. .yml

  2. .properties

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

在您的特定情况下,如果您决定使用扩展名 .properties ,那么您将拥有一个名为 application.properties 的文件 --- src\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

原文由 Abhishek Shah 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题