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

22 ответа

Решение

Почему вы пытаетесь свернуть свое собственное решение? 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, По умолчанию для 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, если вы решили использовать .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

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

server.servlet.context-path

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

см. этот ответ здесь: /questions/44049180/izmenenie-konteksta-razvernutoj-spring-boot-vojnyi-na-servere-kontejnera-tomcat-tak-chto-eto-ne-demo-001-snapshot/44049182#44049182

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

server.servlet.path

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

а также

server.servlet.context-path

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

Если вы используете spring-boot-starter-webflux, используйте:

      spring:
  webflux:
    base-path: /api

Клянусь Богом ... Я каждый раз об этом забываю.

Вы можете сделать это, легко добавив порт и контекстный путь, чтобы добавить конфигурацию в файл [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 boot 1.X

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

с помощью команды java spring boot 2.X

java -jar my-app.jar --server.servlet.context-path=/spring-boot-app --server.port=8585 

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

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

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

Для версии ниже Spring boot 2 вам необходимо использовать приведенный ниже код

server:
   context-path: abc    

И для версии Spring boot 2+ используйте код ниже

server:
  servlet:
    context-path: abc

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

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

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

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

application.properties

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

### Spring boot 2.x #########
server.servlet.context-path=/ClientApp

Принятый ответ работает. С SpringBoot 3.0 это работает:

      server.servlet.context-path=/users

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

Вы можете использовать в Spring Boot: 2.1.6, как показано ниже:

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

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

@Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>
      webServerFactoryCustomizer() {
        return factory -> factory.setContextPath("/demo");
}

Весной Boot 1.5:

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

server.context-path=/demo

Замечания: /demo URL вашего контекста

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

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

Это сработало для меня, работающего в окнах.

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>

Вы можете добавить это свойство в файл свойств Spring

      spring.data.rest.basePath=/your_path

Я вижу много устаревших форматов ответов/контекстных путей. Пожалуйста, используйте последние версии.

application.yml

      server:
  servlet:
    context-path: /hello-context-path

application.properties

      server.servlet.context-path=/hello-context-path
<!-- Server port-->

server.port=8080

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

server.servlet.context-path=/ems

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

Другие вопросы по тегам