Dodaj ścieżkę kontekstową do aplikacji Spring Boot

Próbuję ustawić programowo root kontekstowy aplikacji Spring Boot. Powodem roota kontekstu jest to, że chcemy, aby aplikacja była dostępna z localhost:port/{app_name} i aby wszystkie ścieżki kontrolera były do niej dołączone.

Oto plik konfiguracyjny aplikacji web-app.

@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;
  }
}

Oto kontroler indeksu dla strony głównej.

@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";
  }

}

Nowy root aplikacji powinien znajdować się w localhost:12378/mainstay, ale nadal znajduje się w localhost:12378.

Czego mi brakuje powoduje, że Spring Boot nie dołącza katalogu głównego kontekstu przed mapowaniem żądania?

Author: nbro, 2013-12-05

9 answers

Dlaczego próbujesz rzucić własne rozwiązanie. Spring-boot już to wspiera.

Jeśli jeszcze go nie masz, Dodaj plik application.properties do src\main\resources. W tym pliku właściwości dodaj 2 właściwości:

server.contextPath=/mainstay
server.port=12378

UPDATE (Spring Boot 2.0)

W wersji 2.0 (ze względu na wsparcie zarówno Spring MVC, jak i Spring WebFlux) contextPath zostało zmienione na:
server.servlet.contextPath=/mainstay

Możesz następnie usunąć konfigurację dla niestandardowego kontenera serwletów. Jeśli musisz zrobić trochę post processing na kontenerze możesz dodać implementację EmbeddedServletContainerCustomizer do swojej konfiguracji(na przykład, aby dodać Strony błędów).

Zasadniczo właściwości wewnątrz application.properties służą jako domyślne, zawsze możesz je nadpisać używając innego application.properties obok dostarczonego artefaktu lub dodając parametry JVM (-Dserver.port=6666).

Zobacz także przewodnik referencyjny , w szczególności sekcję właściwości .

Klasa ServerProperties narzędzia EmbeddedServletContainerCustomizer. Wartość domyślna dla contextPath to "". W swojej próbce kodu ustawiasz contextPath bezpośrednio na TomcatEmbeddedServletContainerFactory. Następnie instancja ServerProperties przetworzy tę instancję i zresetuje ją ze ścieżki do "". (ta linia wykonuje null sprawdzanie, ale jako domyślne jest "" zawsze kończy się niepowodzeniem i ustawia kontekst na "" i tym samym nadpisuje Twój).

 280
Author: M. Deinum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-01 05:39:57

Jeśli używasz Spring Boot, nie musisz konfigurować właściwości serwera poprzez inicjalizację Vean.

Zamiast tego, jeśli jedna z funkcji jest dostępna dla podstawowej konfiguracji, można ją ustawić w pliku" właściwości " o nazwie application, który powinien znajdować się pod src\main\resources w strukturze aplikacji. Plik "Właściwości" jest dostępny w dwóch formatach

  1. .yml

  2. .properties

Sposób, w jaki określasz lub ustawiasz konfiguracje różnią się w zależności od formatu.

W twoim konkretnym przypadku, jeśli zdecydujesz się użyć rozszerzenia .properties, W src\main\resources znajdziesz plik o nazwie application.properties z następującymi ustawieniami konfiguracyjnymi

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

OTOH, jeśli zdecydujesz się użyć rozszerzenia .yml (tj. application.yml), będziesz musiał ustawić konfiguracje używając następującego formatu (tj. YAML):

server:
    port: 8080
    contextPath: /context-path

Aby dowiedzieć się więcej o właściwościach sprężynowego buta, skorzystaj z poniższego linku:

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

 24
Author: Abhishek Shah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-28 10:42:33

Jeśli używasz Spring Boot 2.0.0 użyj:

server.servlet.context-path
 11
Author: magemello,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-18 16:00:27

Poprawne właściwości to

server.servlet.path

Aby skonfigurować ścieżkę DispatcherServlet

I

server.servlet.context-path

Aby skonfigurować ścieżkę kontekstu aplikacji poniżej.

 5
Author: Michael Simons,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-24 09:03:36

Możemy ustawić w application.properties jako API_CONTEXT_ROOT=/therootpath

I uzyskujemy do niego dostęp w klasie Java, jak wspomniano poniżej

@Value("${API_CONTEXT_ROOT}")
private String contextRoot;
 2
Author: Sanket,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-28 10:43:42

In Spring Boot 1.5:

Dodaj następującą właściwość w application.properties:

server.context-path=/demo

Uwaga: /demo To Adres URL ścieżki kontekstowej.

 1
Author: Piyush Anjikar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-11 16:13:40

Serwer.contextPath= / mainstay

Działa na mnie, gdybym miał JEDEN plik wojenny w JBOSS. Wśród wielu plików wojennych, gdzie każdy zawiera jboss-web.xml to nie działa. Musiałem umieścić jboss-web.xml wewnątrz katalogu WEB-INF z zawartością

<?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>
 0
Author: Gondri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-01 13:08:22

Należy pamiętać, że " serwer.ścieżka kontekstowa " lub " serwer.servlet.context-path "[począwszy od springboot 2.0.właściwości x] będą działać tylko w przypadku wdrożenia do osadzonego kontenera, np. embedded tomcat. Właściwości te nie będą miały wpływu, jeśli wdrażasz aplikację jako wojnę na przykład do zewnętrznego programu tomcat.

Zobacz tę odpowiedź tutaj: https://stackoverflow.com/a/43856300/4449859

 0
Author: abdel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-02 14:47:59

Ścieżka kontekstowa może być bezpośrednio zintegrowana z kodem, ale nie jest to wskazane, ponieważ nie można jej ponownie użyć, więc zapisz ją w aplikacji.Plik Właściwości serwer.contextPath= / nazwa folderu, w którym umieszczono kod contextPath = nazwa folderu, w którym umieszczono kod/ Uwaga: uważnie obserwuj ukośnik.

 -1
Author: saravanan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-10 13:12:23