我试图以编程方式设置一个Spring Boot应用程序上下文根。上下文根的原因是我们希望从中访问该应用,localhost:port/{app_name}并将所有控制器路径附加到该应用。
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。
localhost:12378/mainstay
localhost:12378
我错过了什么导致Spring Boot在请求映射之前不附加上下文根的问题?
你为什么要尝试推出自己的解决方案。Spring-boot已经支持该功能。
如果你还没有,请向添加application.properties文件src\main\resources。在该属性文件中,添加2个属性:
application.properties
src\main\resources
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在配置中添加一个实现(例如,添加错误页面)。
EmbeddedServletContainerCustomizer
基本上,application.properties服务中的属性是默认属性,你始终可以通过application.properties在交付的工件旁边使用另一个属性或添加JVM参数(-Dserver.port=6666)来覆盖它们。
该类ServerProperties实现EmbeddedServletContainerCustomizer。的默认contextPath值为”“。在代码示例中,你contextPath直接在上设置了TomcatEmbeddedServletContainerFactory。接下来,ServerProperties实例将处理该实例,并将其从你的路径重置为”“。(此行进行null检查,但默认情况下”“总是失败,并将上下文设置为”“,从而覆盖你的上下文)。
ServerProperties
contextPath
TomcatEmbeddedServletContainerFactory