为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

墨色风雨 2019-10-15 14:23:31

我正在尝试以编程方式将Spring Boot应用程序上下文设置为root。上下文根的原因是我们希望从中访问该应用程序,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在请求映射之前不附加上下文根的问题?


查看完整描述

3 回答

?
隔江千里

您为什么要尝试推出自己的解决方案。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检查,但默认情况下""总是失败,并将上下文设置为"",从而覆盖您的上下文)。


查看完整回答
反对 回复 2019-10-15
?
慕丝7291255

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


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


.yml


.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


查看完整回答
反对 回复 2019-10-15
?
MM们

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

查看完整回答
反对 回复 2019-10-15

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信