Добавить контекстный путь к приложению 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 ответов:
почему вы пытаетесь свернуть свое собственное решение. 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
в структуре вашего приложения. Файл "свойства" доступен в двух форматах
.yml
.properties
способ указания или установки конфигураций отличается от одного формата к другому.
в вашем конкретном случае, если вы решите использовать расширение
.properties
, тогда у вас будет файл с именемapplication.properties
подsrc\main\resources
со следующими параметрами конфигурацииserver.port = 8080 server.contextPath = /context-path
OTOH, если вы решили использовать
правильные свойства
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 = имя папки, в которую вы поместили код/ Примечание: внимательно следите за косой чертой.