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


Я пытаюсь установить Spring Boot applications context root программно. Причина корневого контекста заключается в том, что мы хотим, чтобы приложение было доступно из 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 124

9 ответов:

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

если у вас его еще нет, добавьте до 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

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

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

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

класс ServerProperties осуществляет EmbeddedServletContainerCustomizer. Значение по умолчанию для contextPath и "". В вашем примере кода Вы устанавливаете 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 как 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>

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

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

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