我正在尝试以编程方式设置 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 许可协议
你为什么要推出自己的解决方案。 Spring-boot 已经支持了。
如果您还没有,请将
application.properties
文件添加到src\main\resources
。在该属性文件中,添加 2 个属性:更新(春季引导 2.0)
从 Spring Boot 2.0 开始(由于 Spring MVC 和 Spring WebFlux 的支持)
contextPath
已更改为以下内容:然后,您可以删除自定义 servlet 容器的配置。如果您需要对容器进行一些后处理,您可以将
EmbeddedServletContainerCustomizer
实现添加到您的配置中(例如添加错误页面)。基本上
application.properties
中的属性作为默认值,您始终可以通过使用另一个application.properties
在您交付的工件旁边或通过添加 JVM 参数(-Dserver.port=6666
).另请参阅 参考指南,尤其是 属性 部分。
类
ServerProperties
实现EmbeddedServletContainerCustomizer
。contextPath
的默认值是""
。在您的代码示例中,您直接在contextPath
上设置TomcatEmbeddedServletContainerFactory
。接下来ServerProperties
实例将处理此实例并将其从您的路径重置为""
。 ( 此行 执行null
检查,但默认为""
它总是失败并将上下文设置为""
并因此覆盖你的)。