Добавить контекстный путь к приложению Spring Boot

Я пытаюсь установить корневой контекст приложений 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 не добавлять корневой контекст перед отображением запроса?

9 ответов


почему вы пытаетесь свернуть свое собственное решение. Spring-boot уже поддерживает это.

если у вас его еще нет, добавьте до src\main\resources. В этом файле свойств добавьте 2 свойства:

server.contextPath=/mainstay
server.port=12378

обновление (Весенняя загрузка 2.0)

начиная с Spring Boot 2.0 (благодаря поддержке Spring MVC и Spring WebFlux)contextPath было изменено на следующее:

server.servlet.contextPath=/mainstay

вы потом можете удалить конфигурация для пользовательского контейнера сервлетов. Если вам нужно сделать некоторую обработку post на контейнере, вы можете добавить EmbeddedServletContainerCustomizer реализация в вашей конфигурации (например, для добавления страниц ошибок).

в основном свойства внутри application.properties служить по умолчанию, вы всегда можете переопределить их с помощью другой application.properties рядом с доставляемым артефактом или путем добавления параметров JVM (-Dserver.port=6666).

см. также Справочник особенно свойства.

класс ServerProperties осуществляет EmbeddedServletContainerCustomizer. Значение по умолчанию для contextPath is "". В примере кода Вы устанавливаете contextPath непосредственно на TomcatEmbeddedServletContainerFactory. Далее ServerProperties экземпляр обработает этот экземпляр и сбросит его с вашего пути до "". (эта строка тут null проверить, но по умолчанию это "" он всегда терпит неудачу и устанавливает контекст в "" и тем самым перекрывая твой.)


если вы используете Spring Boot, вам не нужно настраивать свойства сервера с помощью инициализации Vean.

вместо этого, если одна функциональность доступна для базовой конфигурации, то она может быть установлена в файле "свойства" с именем application, который должен находиться под src\main\resources в структуре приложения. Файл "свойства" доступен в двух форматах

  1. .yml

  2. .properties

способ, которым вы указываете или устанавливаете конфигурации, отличается от одного формата к другому.

в вашем конкретном случае, если вы решите использовать расширение .properties, тогда у вас будет файл с именем application.properties под src\main\resources со следующими параметрами конфигурации

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

OTOH, если вы решите использовать


Если вы используете Spring Boot 2.0.0 используйте:

server.servlet.context-path

правильные свойства

server.servlet.path

для настройки пути к DispatcherServlet

и

server.servlet.context-path

настроить путь контекста приложения, ниже.


мы можем установить его в application.properties as API_CONTEXT_ROOT=/therootpath

и мы обращаемся к нему в классе Java, как указано ниже

@Value("${API_CONTEXT_ROOT}")
private String contextRoot;

Весной Загрузки 1.5:

добавьте следующее свойство в application.properties:

server.context-path=/demo

Примечание: /demo Ваш URL-адрес пути контекста.


сервер.contextPath= / mainstay

работает для меня, если у меня был один файл войны в JBOSS. Среди нескольких файлов войны, где каждый содержит jboss-web.xml это не сработало. Я должен был поставить jboss-web.xml внутри каталога WEB-INF с содержимым

<?xml version="1.0" encoding="UTF-8"?>
<jboss-web xmlns="http://www.jboss.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee http://www.jboss.org/j2ee/schema/jboss-web_5_1.xsd">
    <context-root>mainstay</context-root>
</jboss-web>

обратите внимание, что "сервер.context-path" или "сервер.сервлет.контекст-путь" [начиная с springboot 2.0.X] свойства будут работать только при развертывании во встроенном контейнере, например, embedded tomcat. Эти свойства не будут иметь никакого эффекта, если вы развертываете приложение как войну на внешний tomcat, например.

см. этот ответ здесь:https://stackoverflow.com/a/43856300/4449859


контекстный путь может быть непосредственно интегрирован в код, но это не рекомендуется, так как он не может быть повторно использован так писать в приложении.файл свойств сервер.contextPath= / имя папки, в которую вы поместили код contextPath = имя папки, в которой вы разместили код/ Примечание: внимательно следите за косой чертой.