Aggiungi il percorso di contesto all’applicazione Spring Boot

Sto cercando di impostare una root di contesto delle applicazioni Spring Boot a livello di programmazione. Il motivo della root di contesto è che vogliamo che l’app sia accessibile da localhost:port/{app_name} e che tutti i percorsi del controller siano localhost:port/{app_name} ad esso.

Ecco il file di configurazione dell’applicazione per l’app Web.

 @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 pageHandlers; @PostConstruct private void init(){ pageHandlers = new HashSet(); 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; } } 

Ecco il controller di indice per la pagina principale.

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

La nuova radice dell’applicazione deve trovarsi su localhost:12378/mainstay , ma si trova ancora su localhost:12378 .

Cosa mi manca che stia facendo sì che Spring Boot non accluda la root di contesto prima del mapping delle richieste?

Perché stai cercando di ottenere la tua soluzione. Spring-boot lo supporta già.

Se non ne hai già uno, aggiungi un file application.properties a src\main\resources . In quel file di proprietà, aggiungi 2 proprietà:

 server.contextPath=/mainstay server.port=12378 

AGGIORNAMENTO (Spring Boot 2.0)

A partire da Spring Boot 2.0 (grazie al supporto sia di Spring MVC che di Spring WebFlux) il contextPath è stato modificato come segue:

 server.servlet.contextPath=/mainstay 

È quindi ansible rimuovere la configurazione per il contenitore del servlet personalizzato. Se è necessario eseguire una post elaborazione sul contenitore, è ansible aggiungere un’implementazione di EmbeddedServletContainerCustomizer alla propria configurazione (ad esempio per aggiungere le pagine di errore).

Fondamentalmente le proprietà all’interno di application.properties sono predefinite, è sempre ansible sovrascriverle utilizzando un’altra application.properties accanto alla -Dserver.port=6666 o aggiungendo i parametri JVM ( -Dserver.port=6666 ).

Vedi anche la Guida di riferimento, in particolare la sezione delle proprietà .

La class ServerProperties implementa EmbeddedServletContainerCustomizer . L’impostazione predefinita per contextPath è "" . Nell’esempio di codice si imposta contextPath direttamente su TomcatEmbeddedServletContainerFactory . Quindi l’istanza ServerProperties elaborerà questa istanza e la reimposterà dal percorso a "" . ( Questa riga esegue un controllo null ma, poiché il valore predefinito è "" fallisce sempre e imposta il contesto su "" e quindi esclude il tuo).

Se si utilizza Spring Boot, non è necessario configurare le proprietà del server tramite l’inizializzazione di Vean.

Invece, se una funzionalità è disponibile per la configurazione di base, può essere impostata in un file “proprietà” chiamato application , che deve trovarsi in src\main\resources nella struttura dell’applicazione. Il file “proprietà” è disponibile in due formati

  1. .yml

  2. .properties

Il modo in cui specifichi o imposta le configurazioni differisce da un formato all’altro.

Nel tuo caso specifico, se decidi di utilizzare l’estensione .properties , avresti un file chiamato application.properties in src\main\resources con le seguenti impostazioni di configurazione

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

OTOH, se decidi di usare l’estensione .yml (es. application.yml ), dovrai impostare le configurazioni usando il seguente formato (es. YAML ):

 server: port: 8080 contextPath: /context-path 

Per ulteriori proprietà comuni di Spring Boot fare riferimento al link sottostante:

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

Se usi Spring Boot 2.0.0 usa:

 server.servlet.context-path 

Le proprietà corrette sono

 server.servlet.path 

per configurare il percorso di DispatcherServlet

e

 server.servlet.context-path 

per configurare il percorso del contesto delle applicazioni al di sotto di quello.

Possiamo impostarlo in application.properties come API_CONTEXT_ROOT=/therootpath

E lo accediamo nella class Java come indicato di seguito

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

In Spring Boot 1.5:

Aggiungere la seguente proprietà in application.properties :

 server.context-path=/demo 

Nota: /demo è il tuo URL del percorso di contesto.

server.contextPath = / pilastro

funziona per me se avessi un file di guerra in JBOSS. Tra più file di guerra in cui ciascuno contiene jboss-web.xml non ha funzionato. Ho dovuto inserire jboss-web.xml all’interno della directory WEB-INF con il contenuto

   mainstay  

si noti che le proprietà “server.context-path” o “server.servlet.context-path” [a partire da springboot 2.0.x] funzioneranno solo se si sta eseguendo la distribuzione in un contenitore incorporato, ad esempio, tomcat incorporato. Queste proprietà non avranno alcun effetto se si sta distribuendo l’applicazione come una guerra a un tomcat esterno, ad esempio.

vedere questa risposta qui: https://stackoverflow.com/a/43856300/4449859

il percorso di contesto può essere direttamente integrato nel codice ma non è consigliabile in quanto non può essere riutilizzato, quindi scrivi nel file application.properties server.contextPath = / nome della cartella in cui hai inserito il codice contextPath = nome della cartella in cui hai posizionato il codice / Nota: guarda attentamente la barra.