Добавить контекстный путь к приложению 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
в вашей структуре приложения. Файл "Свойства" доступен в двух форматах
.yml
.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 = имя папки, в которую вы поместили код / Примечание: внимательно следите за косой чертой.