Agregar ruta de contexto a la aplicación Spring Boot

Estoy tratando de establecer una raíz de contexto de las aplicaciones Spring Boot programmatically. El motivo de la raíz de contexto es que queremos que se acceda a la aplicación desde localhost:port/{app_name} y tener todas las rutas de acceso del controlador localhost:port/{app_name} .

Aquí está el archivo de configuración de la aplicación 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; } } 

Aquí está el controlador de índice para la página principal.

 @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 nueva raíz de la aplicación debe estar en localhost:12378/mainstay , pero aún se encuentra en localhost:12378 .

¿Qué me está haciendo perder que Spring Boot no anexe la raíz de contexto antes de la asignación de la solicitud?

¿Por qué estás tratando de rodar tu propia solución? Spring-boot ya lo admite.

Si aún no tiene uno, agregue un archivo application.properties a src\main\resources . En ese archivo de propiedades, agregue 2 propiedades:

 server.contextPath=/mainstay server.port=12378 

ACTUALIZACIÓN (Spring Boot 2.0)

A partir de Spring Boot 2.0 (debido al soporte de Spring MVC y Spring WebFlux) el contextPath se ha cambiado a lo siguiente:

 server.servlet.contextPath=/mainstay 

Luego puede eliminar su configuración para el contenedor de servlets personalizado. Si necesita realizar algún procesamiento posterior en el contenedor, puede agregar una implementación EmbeddedServletContainerCustomizer a su configuración (por ejemplo, para agregar las páginas de error).

Básicamente, las propiedades dentro de application.properties sirven como valor predeterminado. Siempre puede anularlas mediante el uso de otra application.properties junto al artefacto que entregue o agregando parámetros de JVM ( -Dserver.port=6666 ).

Consulte también la Guía de referencia, especialmente la sección de propiedades .

La clase ServerProperties implementa EmbeddedServletContainerCustomizer . El valor predeterminado para contextPath es "" . En su ejemplo de código, está configurando el contextPath directamente en TomcatEmbeddedServletContainerFactory . A continuación, la instancia de ServerProperties procesará esta instancia y la restablecerá desde su ruta a "" . ( Esta línea realiza una comprobación null , pero como el valor predeterminado es "" , siempre falla y establece el contexto en "" y anula el suyo).

Si está utilizando Spring Boot, no tiene que configurar las propiedades del servidor mediante la inicialización de Vean.

En cambio, si una funcionalidad está disponible para la configuración básica, se puede configurar en un archivo de “propiedades” denominado application , que debe residir en src\main\resources en la estructura de la aplicación. El archivo “propiedades” está disponible en dos formatos

  1. .yml

  2. .properties

La forma de especificar o configurar las configuraciones difiere de un formato a otro.

En su caso específico, si decide usar la extensión .properties , entonces tendrá un archivo llamado application.properties en src\main\resources con la siguiente configuración

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

OTOH, si decides usar la extensión .yml (es decir, application.yml ), necesitarías establecer las configuraciones usando el siguiente formato (es decir, YAML ):

 server: port: 8080 contextPath: /context-path 

Para conocer las propiedades más comunes de Spring Boot, consulte el siguiente enlace:

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

Si usa Spring Boot 2.0.0, use:

 server.servlet.context-path 

Las propiedades correctas son

 server.servlet.path 

para configurar la ruta del DispatcherServlet

y

 server.servlet.context-path 

para configurar la ruta del contexto de las aplicaciones debajo de eso.

Podemos establecerlo en application.properties como API_CONTEXT_ROOT=/therootpath

Y accedemos a ella en la clase Java como se menciona a continuación

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

En Spring Boot 1.5:

Agregue la siguiente propiedad en application.properties :

 server.context-path=/demo 

Nota: /demo es tu URL de ruta de contexto.

server.contextPath = / mainstay

funciona para mí si tuviera un archivo war en JBOSS. Entre varios archivos war donde cada uno contiene jboss-web.xml, no funcionó. Tuve que poner jboss-web.xml dentro del directorio WEB-INF con contenido

 < ?xml version="1.0" encoding="UTF-8"?>  mainstay  

tenga en cuenta que las propiedades “server.context-path” o “server.servlet.context-path” [starting from springboot 2.0.x] solo funcionarán si está implementando en un contenedor incrustado, por ejemplo, embedded tomcat. Estas propiedades no tendrán efecto si está implementando su aplicación como una guerra a un gato externo, por ejemplo.

vea esta respuesta aquí: https://stackoverflow.com/a/43856300/4449859

La ruta de contexto se puede integrar directamente en el código, pero no es recomendable ya que no se puede reutilizar, escriba en el archivo application.properties server.contextPath = / nombre de la carpeta donde colocó el código contextPath = nombre de la carpeta donde colocó el código / Nota: observe la barra con cuidado.