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

2022-08-31 05:57:00

我正在尝试以编程方式设置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/mainstaylocalhost:12378

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


答案 1

您为什么要尝试推出自己的解决方案。Spring-boot已经支持这一点。

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

server.contextPath=/mainstay
server.port=12378

更新(弹簧靴2.0)

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

server.servlet.context-path=/mainstay

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

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

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

ServerProperties 实现了 .的缺省值为 。在代码示例中,您将直接在 上设置 .接下来,实例将处理此实例,并将其从路径重置为 。(此行执行检查,但作为默认值,它始终失败并将上下文设置为并因此覆盖您的上下文)。EmbeddedServletContainerCustomizercontextPath""contextPathTomcatEmbeddedServletContainerFactoryServerProperties""null""""


答案 2

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

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

  1. .yml

  2. .properties

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

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

server.port = 8080
server.contextPath = /context-path

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

server:
    port: 8080
    contextPath: /context-path

有关弹簧靴的更常见属性,请参阅以下链接:

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


推荐