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

174

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

Ответы:

382

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

Если у вас его еще нет, добавьте application.propertiesфайл в 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. По умолчанию для contextPathIS "". В вашем примере кода вы устанавливаете contextPathнепосредственно на TomcatEmbeddedServletContainerFactory. Затем ServerPropertiesэкземпляр обработает этот экземпляр и сбросит его с вашего пути к "". ( Эта строка выполняет nullпроверку, но по умолчанию ""она всегда терпит неудачу и устанавливает контекст ""и, таким образом, переопределяет ваш).

М. Дейн
источник
Хотя ваш ответ правильный (я имею в виду, вы можете настроить свойства контейнера сервлета с помощью файла свойств приложения), почему существует метод setContextPath (путь), я имею в виду, если путь не является обязательным, для чего он нужен? Кстати, то же самое касается setContextPath (...) на EmbeddedServletContainerCustomizer
Моди
2
Я ожидал бы, что один EmbeddedServletContainerCustomizerтакже будет работать. Но я бы пошел, что предоставляется, вместо того, чтобы пытаться сбежать самостоятельно. Почему ваше решение не работа связана с поведением по умолчанию запрограммирован (? Случайно) в ServerProperties, по умолчанию настроен contextPathэто ""(и он проверяет nullи не ""Последние переопределение ваши явным образом . contextPath.
М. Deinum
Свойства изменились, см. Мой ответ ниже.
Майкл Симонс
5
Я предполагаю, что свойство в Spring Boot 2.0 - "server.servlet.context-path"
IamVickyAV
34

Если вы используете 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, если вы решите использовать .ymlрасширение (то есть application.yml), вам нужно будет установить конфигурации, используя следующий формат (то есть YAML):

server:
    port: 8080
    contextPath: /context-path

Для более общих свойств Spring Boot обратитесь к ссылке ниже:

https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

Абхишек Шах
источник
22

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

server.servlet.context-path
magemello
источник
2
это не работает для военных файлов, развернутых во внешнем tomcat
pise
1
Для меня это не сработало (Spring Boot 2.1.2), но сработало так:server.servlet.contextPath=/api
lospejos
2
@pise, ты знал, как исправить это для файла war во внешнем коте?
Мохакс
11

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

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

Абделя
источник
Кто-нибудь разобрался, как это настроить при развертывании на внешний tomcat в виде warфайла с использованием springboot v2.xи tomcat v8.5?
Простое решение
@abdel, даже я искал ответ, что если мы развернем файл war во внешнем коте, как установить контекстный путь.
пис
Я пробовал это. Это так же, как было сказано в ссылке выше. Измените значение атрибута build -> finalName на свой контекстный путь. В результате полученный файл войны будет использовать путь контекста в качестве имени файла, который затем будет использоваться tomcat в качестве пути контекста.
DriLLFreAK100
единственный способ, которым я могу представить развертывание как войны во внешнем коте, - убедиться, что название войны соответствует контексту, который вы ищете. так, например, если вы хотите, чтобы контекст был '/ xyzwebapp', тогда ваша война должна называться xyzwebapp.war. Чтобы достичь этого, вы можете добавить следующее в элемент <build> в вашем pom.xml: <finalName> xyzwebapp </ finalName>.
19
9

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

server.servlet.path

настроить путь к DispatcherServlet

и

server.servlet.context-path

настроить путь контекста приложений ниже этого.

Майкл Симонс
источник
Большое вам спасибо
Хема Чандра
2

Мы можем изменить корневой путь контекста, используя простую запись в файле свойств.

application.properties

### Spring boot 1.x #########
server.contextPath=/ClientApp

### Spring boot 2.x #########
server.servlet.context-path=/ClientApp
Рамакотредды Нагиредды
источник
1

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

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

@Value("${API_CONTEXT_ROOT}")
private String contextRoot;
Sanket
источник
1

server.contextPath = / опора

работает для меня, если бы у меня был один военный файл в 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>
Gondri
источник
1

Весной Boot 1.5:

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

server.context-path=/demo

Примечание: /demoваш контекстный путь URL.

Пиюш Анжикар
источник
1

Вы можете сделать это, просто добавив порт и contextpath, чтобы добавить конфигурацию в файл [src \ main \ resources] .properties, а также в файл .yml.

Конфигурация файла application.porperties

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

настройка файла application.yml

server:
port: 8084
contextPath: /context-path

Мы также можем изменить это программно в весенней загрузке.

@Component
public class ServerPortCustomizer implements     WebServerFactoryCustomizer<EmbeddedServletContainerCustomizer > {

@Override
public void customize(EmbeddedServletContainerCustomizer factory) {
    factory.setContextPath("/context-path");
    factory.setPort(8084);
}

}

Мы также можем добавить другой способ

@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {SpringApplication application =     new pringApplication(MyApplication.class);
    Map<String, Object> map = new HashMap<>();
    map.put("server.servlet.context-path", "/context-path");
    map.put("server.port", "808");
    application.setDefaultProperties(map);
    application.run(args);
    }       
}

используя команду Java Spring Spring 1.X

java -jar my-app.jar --server.contextPath=/spring-boot-app     --server.port=8585 

используя команду Java Spring Spring 2.X

java -jar my-app.jar --server.servlet.context-path=/spring-boot-app --server.port=8585 
Гулам Муртаза
источник
мы также можем добавить порт сервера программно
Гулам Муртаза
0

Если вы используете application.yml и весеннюю версию выше 2.0, настройте ее следующим образом.

server:
  port: 8081
  servlet:
     context-path: /demo-api

Теперь все вызовы API будут выглядеть как http: // localhost: 8081 / demo-api /

Свапнил Ганград
источник
0

Мы можем установить это используя WebServerFactoryCustomizer. Это можно добавить непосредственно в основной метод весенней загрузки, который запускает Spring ApplicationContext.

@Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>
      webServerFactoryCustomizer() {
        return factory -> factory.setContextPath("/demo");
}
павана
источник
0

Если вы используете Spring Boot 2.x и хотите передать свойство context path в командной строке, вы должны поставить double // примерно так:

--server.servlet.context-path=//your-path

Это работает для меня, работает в Windows.

Marco
источник
0
<!-- Server port-->

server.port=8080

<!--Context Path of the Application-->

server.servlet.context-path=/ems
Бордолой Парт
источник
Порт сервера будет 8080. Если вы хотите любой другой порт, вы можете заменить 8080. Для пути к контексту приложения я установил ems. Вы можете установить другой путь в соответствии с вашими требованиями
Bordoloi Parth
1
Это полезная информация, почему бы вам не добавить ее в свой ответ вместо комментария?
К-ден
0

Это должно быть: server.servlet.context-path = / demo, обратите внимание, что в нем нет кавычек, только значение, которому предшествует '/', это значение входит в ваш файл application.properties

Осирис а. Суарес
источник
-1

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

Saravanan
источник