Explore Courses Blog Tutorials Interview Questions
0 votes
in Java by (10.2k points)

I am trying to set a Spring Boot applications context root programmatically. The reason for the context root is we want the app to be accessed from localhost:port/{app_name} and have all the controller paths append to it.

Here is the application configuration file for the web-app.


public class ApplicationConfiguration {

  Logger logger = LoggerFactory.getLogger(ApplicationConfiguration.class);


  private String port;


  private String context;

  private Set<ErrorPage> pageHandlers;


  private void init(){

      pageHandlers = new HashSet<ErrorPage>();

      pageHandlers.add(new ErrorPage(HttpStatus.NOT_FOUND,"/notfound.html"));

      pageHandlers.add(new ErrorPage(HttpStatus.FORBIDDEN,"/forbidden.html"));



  public EmbeddedServletContainerFactory servletContainer(){

      TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();"Setting custom configuration for Mainstay:");"Setting port to {}",port);"Setting context to {}",context);




      return factory;


  public String getPort() {

      return port;


  public void setPort(String port) {

      this.port = port;



Here is the index controller for the main page.


public class IndexController {

  Logger logger = LoggerFactory.getLogger(IndexController.class);


  public String index(Model model){"Setting index page title to Mainstay - Web");

      model.addAttribute("title","Mainstay - Web");

      return "index";



The new root of the application should be at localhost:12378/mainstay, but it is still located at localhost:12378.

What am I missing that is causing Spring Boot to not append the context root before the request mapping?

1 Answer

0 votes
by (46k points)

Why are you trying to roll your own solution. Spring-boot already supports that.

If you don't already have one, add an file to src\main\resources. In that properties file, add 2 properties:



As of Spring Boot 2.0 (due to the support of both Spring MVC and Spring WebFlux) the contextPath has been changed to the following:


You can then remove your configuration for the custom servlet container. If you need to do some post processing on the container you can add a EmbeddedServletContainerCustomizer implementation to your configuration (for instance to add the error pages).

Basically the properties inside the serve as a default you can always override them by using another next to the artifact you deliver or by adding JVM parameters (-Dserver.port=6666).

See also The Reference Guide especially the properties section.

The class ServerProperties implements the EmbeddedServletContainerCustomizer. The default for contextPath is "". In your code sample you are setting the contextPath directly on the TomcatEmbeddedServletContainerFactory. Next the ServerProperties instance will process this instance and reset it from your path to "". (This line does a null check but as the default is "" it always fail and set the context to "" and thus overriding yours).

Browse Categories