Додайте контекстний шлях до програми 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 не додає корінь контексту перед відображенням запиту?

Відповіді:


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. За замовчуванням contextPath- "". У своєму зразку коду ви встановлюєте contextPathбезпосередньо на TomcatEmbeddedServletContainerFactory. Далі ServerPropertiesекземпляр обробить цей екземпляр і скине його зі свого шляху до "". ( Цей рядок робить nullперевірку, але, як за замовчуванням, ""він завжди провалюється і встановлює контекст ""і, таким чином, переосмислює ваш).


Хоча ваша відповідь правильна (я маю на увазі, ви можете налаштувати властивості контейнера сервлетів за допомогою файлу властивостей програми), чому існує метод setContextPath (path), я маю на увазі, якщо шлях не застосовується, для чого це добре? BTW, те ж саме стосується setContextPath (...) на EmbeddedServletContainerCustomizer
Modi

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

2
це не працює для файлів війни, розгорнутих у зовнішній tomcat
pise

1
Для мене це не спрацювало (Spring Boot 2.1.2), але все-таки спрацювало так:server.servlet.contextPath=/api
lospejos

2
@pise, ти знав, як це виправити для файлу війни у ​​зовнішньому tomcat?
mohax

11

зауважте, що властивості "server.context-path" або "server.servlet.context-path" [починаючи з springboot 2.0.x] працюватимуть лише в тому випадку, якщо ви розгортаєтесь у вбудований контейнер, наприклад, вбудований tomcat. Ці властивості не матимуть ніякого ефекту, якщо ви, наприклад, розгортаєте свою програму як війна із зовнішнім tomcat.

дивіться цю відповідь тут: https://stackoverflow.com/a/43856300/4449859


Хтось придумав, як налаштувати це під час розгортання у зовнішній tomcat як warфайл із використанням springboot v2.xта tomcat v8.5?
Simple-Solution

@abdel навіть я шукаю відповіді, що робити, якщо ми розгортаємо файл війни у ​​зовнішньому tomcat, як встановити контекстний шлях.
піс

Я пробував це. Це точно так, як було сказано у посиланні вище. Змініть значення атрибута build -> finalName на ваш контекстний шлях. Отриманий файл війни потім буде використовувати шлях контексту як ім'я файлу, який потім буде використовуватися tomcat, щоб слугувати контекстним шляхом.
DriLLFreAK100

Єдиний спосіб, який я можу придумати для розгортання як війни у ​​зовнішньому tomcat, - це переконатися, що ім'я війни відповідає контексту, який ви хочете. наприклад, якщо ви хочете, щоб контекст був "/ xyzwebapp", то вашу війну слід назвати xyzwebapp.war. щоб досягти цього, ви можете додати до елемента <build> у своєму pom.xml: <finalName> xyzwebapp </finalName>.
абдель

9

Правильні властивості є

server.servlet.path

щоб налаштувати шлях DispatcherServlet

і

server.servlet.context-path

щоб налаштувати шлях контексту додатків нижче цього.


Дуже дякую
hema chandra

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;

1

server.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>

1

У весняному завантаженні 1.5:

Додайте таку властивість у application.properties:

server.context-path=/demo

Примітка: /demoце URL-адреса вашого контексту.


1

Ви можете зробити це, легко додавши порт і контекст, щоб легко додати конфігурацію у файл [src \ main \ ресурси] .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 весняного завантаження 1.X

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

використовуючи команду java весна завантаження 2.X

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

ми також можемо додати порт сервера програмно
Ghulam

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 і хочете передати властивість контуру контексту в командному рядку, вам слід поставити подвійний // так:

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

Це працювало для мене, працюючи в Windows.


0
<!-- Server port-->

server.port=8080

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

server.servlet.context-path=/ems

Порт сервера буде 8080. якщо ви хочете будь-який інший порт, ви можете замінити 8080. Для контекстного шляху програми я встановив ems. Ви можете встановити інший шлях відповідно до вашої вимоги
Бордолой Парф

1
Це корисна інформація, чому ви не додасте її у відповідь замість коментаря?
k-den

0

Це повинно бути: server.servlet.context-path = / demo зауважте, що у нього немає котирувань лише значення, яке передує '/', це значення переходить у файл application.properties


-1

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.