wake-up-neo.com

Fügen Sie der Spring Boot-Anwendung einen Kontextpfad hinzu

Ich versuche, einen Kontextstamm für Spring Boot-Anwendungen programmgesteuert festzulegen. Der Grund für das Kontextstammverzeichnis ist, dass auf die App von localhost:port/{app_name} Aus zugegriffen werden soll und alle Controller-Pfade daran angehängt werden sollen.

Hier ist die Anwendungskonfigurationsdatei für die 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;
  }
}

Hier ist der Index-Controller für die Hauptseite.

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

}

Das neue Stammverzeichnis der Anwendung sollte sich bei localhost:12378/mainstay Befinden, aber es befindet sich weiterhin bei localhost:12378.

Was fehlt, wenn Spring Boot den Kontextstamm nicht vor der Anforderungszuordnung anhängt?

145
CorreyS

Warum versuchen Sie, Ihre eigene Lösung zu entwickeln? Spring-Boot unterstützt das bereits.

Wenn Sie noch keine haben, fügen Sie eine application.properties - Datei zu src\main\resources Hinzu. Fügen Sie dieser Eigenschaftendatei zwei Eigenschaften hinzu:

server.contextPath=/mainstay
server.port=12378

UPDATE (Spring Boot 2.0)

Ab Spring Boot 2.0 (aufgrund der Unterstützung von Spring MVC und Spring WebFlux) wurde contextPath folgendermaßen geändert:

server.servlet.contextPath=/mainstay

Sie können dann Ihre Konfiguration für den benutzerdefinierten Servlet-Container entfernen. Wenn Sie den Container nachbearbeiten müssen, können Sie Ihrer Konfiguration eine EmbeddedServletContainerCustomizer -Implementierung hinzufügen (zum Beispiel, um die Fehlerseiten hinzuzufügen).

Grundsätzlich dienen die Eigenschaften in application.properties Als Standard. Sie können sie jederzeit überschreiben, indem Sie ein anderes application.properties Neben dem von Ihnen gelieferten Artefakt verwenden oder JVM-Parameter (-Dserver.port=6666) Hinzufügen.

Siehe auch Das Referenzhandbuch insbesondere den Abschnitt Eigenschaften .

Die Klasse ServerProperties implementiert das EmbeddedServletContainerCustomizer. Die Standardeinstellung für contextPath ist "". In Ihrem Codebeispiel setzen Sie das contextPath direkt auf das TomcatEmbeddedServletContainerFactory. Als Nächstes verarbeitet die Instanz ServerProperties diese Instanz und setzt sie von Ihrem Pfad zu "" Zurück. ( Diese Zeile prüft null, aber da die Standardeinstellung "" Ist, schlägt dies immer fehl und setzt den Kontext auf "" Und überschreibt Ihren).

336
M. Deinum

Wenn Sie Spring Boot verwenden, müssen Sie die Servereigenschaften nicht über die Vean-Initialisierung konfigurieren.

Wenn stattdessen eine Funktion für die Grundkonfiguration verfügbar ist, kann diese in einer Eigenschaftendatei mit dem Namen application festgelegt werden, die sich in Ihrer Anwendungsstruktur unter src\main\resources Befinden sollte. Die "Eigenschaften" -Datei ist in zwei Formaten verfügbar

  1. .yml

  2. .properties

Die Art und Weise, wie Sie die Konfigurationen angeben oder festlegen, unterscheidet sich von Format zu Format.

Wenn Sie sich in Ihrem speziellen Fall für die Erweiterung .properties Entscheiden, erhalten Sie eine Datei mit dem Namen application.properties Unter src\main\resources Mit den folgenden Konfigurationseinstellungen

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

OTOH, wenn Sie die Erweiterung .yml Verwenden möchten (d. H. application.yml), Müssen Sie die Konfigurationen im folgenden Format festlegen (d. H. YAML):

server:
    port: 8080
    contextPath: /context-path

Weitere allgemeine Eigenschaften von Spring Boot finden Sie unter folgendem Link:

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

26
Abhishek Shah

Wenn Sie Spring Boot 2.0.0 verwenden, verwenden Sie:

server.servlet.context-path
16
magemello

beachten Sie, dass die Eigenschaften "server.context-path" oder "server.servlet.context-path" [ab springboot 2.0.x] nur funktionieren, wenn Sie in einem eingebetteten Container, z. B. Embedded Tomcat, implementieren. Diese Eigenschaften haben keine Auswirkung, wenn Sie Ihre Anwendung beispielsweise als War für einen externen Tomcat bereitstellen.

sehen Sie diese Antwort hier: https://stackoverflow.com/a/43856300/4449859

8
abdel

Die richtigen Eigenschaften sind

server.servlet.path

um den Pfad des DispatcherServlet zu konfigurieren

und

server.servlet.context-path

um den Pfad des Anwendungskontexts darunter zu konfigurieren.

7
Michael Simons

Wir können es in application.properties Als API_CONTEXT_ROOT=/therootpath Einstellen.

Und wir greifen darauf in der Java Klasse zu, wie unten erwähnt

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

Im Frühjahr Boot 1.5:

Fügen Sie die folgende Eigenschaft in application.properties Hinzu:

server.context-path=/demo

Hinweis: /demo Ist Ihre Kontextpfad-URL.

1
Piyush Anjikar

server.contextPath =/mainstay

funktioniert für mich, wenn ich eine Kriegsdatei in JBOSS habe. Unter mehreren Kriegsdateien, in denen jede jboss-web.xml enthält, hat es nicht funktioniert. Ich musste jboss-web.xml mit Inhalt in das WEB-INF-Verzeichnis stellen

<?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
Gondri

Sie können dies tun, indem Sie einfach den Port und den Kontextpfad hinzufügen, um die Konfiguration in der Datei [src\main\resources] .properties und auch in der Datei .yml hinzuzufügen

konfiguration der Datei application.porperties

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

konfiguration der Datei application.yml

server:
port: 8084
contextPath: /context-path

Wir können es auch programmgesteuert im Frühlingsstiefel ändern.

@Component
public class ServerPortCustomizer implements     WebServerFactoryCustomizer<EmbeddedServletContainerCustomizer > {

@Override
public void customize(EmbeddedServletContainerCustomizer factory) {
    factory.setContextPath("/context-path");
    factory.setPort(8084);
}

}

Wir können auch einen anderen Weg hinzufügen

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

mit dem Befehl Java spring boot 1.X

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

mit dem Befehl Java spring boot 2.X

Java -jar my-app.jar --server.servlet.context-path=/spring-boot-app --server.port=8585 
0
Ghulam Murtaza