小编典典

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

all

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


阅读 127

收藏
2022-06-15

共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) 来覆盖它们。

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

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

2022-06-15