Agregar ruta de contexto a la aplicación Spring Boot
Estoy tratando de establecer una raíz de contexto de Spring Boot applications mediante programación. La razón de la raíz de contexto es que queremos que se acceda a la aplicación desde localhost:port/{app_name}
y que se le agreguen todas las rutas del controlador.
Aquí está el archivo de configuración de la aplicación para 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<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;
}
}
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 todavía se encuentra en localhost:12378
.
Lo que me falta es ¿haciendo que Spring Boot no anexe la raíz de contexto antes de la asignación de la solicitud?
9 answers
¿Por qué estás tratando de rodar su propia solución. Spring-boot ya soporta eso.
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 (Arranque de primavera 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 servlet personalizado. Si necesita hacer algún post procesamiento 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 la application.properties
sirven como un valor predeterminado siempre se puede sobrescribir mediante el uso de otro application.properties
junto al artefacto que entrega o mediante la adición de parámetros JVM (-Dserver.port=6666
).
Vea también La Guía de Referenciaespecialmente la sección propiedades.
La clase ServerProperties
implementa el EmbeddedServletContainerCustomizer
. El valor predeterminado para contextPath
es ""
. En su ejemplo de código está configurando el contextPath
directamente en el TomcatEmbeddedServletContainerFactory
. A continuación, la instancia ServerProperties
procesará esta instancia y la restablecerá desde su ruta a ""
. (Esta línea hace una verificación null
pero como el valor predeterminado es ""
siempre falla y establece el contexto en ""
y, por lo tanto, anula el tuyo).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-01 05:39:57
Si está utilizando Spring Boot, entonces no tiene que configurar las propiedades del servidor a través de la inicialización Vean.
En su lugar, si una funcionalidad está disponible para la configuración básica, entonces se puede establecer en un archivo de "propiedades" llamado application
, que debe residir en src\main\resources
en la estructura de su aplicación. El archivo" propiedades " está disponible en dos formatos
.yml
.properties
La forma en que se especifica o establece el las configuraciones difieren de un formato a otro.
En su caso específico, si decide usar la extensión .properties
, entonces tendría un archivo llamado application.properties
bajo src\main\resources
con los siguientes parámetros de configuración
server.port = 8080
server.contextPath = /context-path
OTOH, si decide usar la extensión .yml
(es decir, application.yml
), deberá establecer las configuraciones utilizando el siguiente formato (es decir,YAML
):
server:
port: 8080
contextPath: /context-path
Para las propiedades más comunes de la bota de resorte, consulte el siguiente enlace:
Https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-28 10:42:33
Si usa Spring Boot 2.0.0 use:
server.servlet.context-path
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-18 16:00:27
Las propiedades correctas son
server.servlet.path
Para configurar la ruta del DispatcherServlet
Y
server.servlet.context-path
Para configurar la ruta de acceso del contexto de aplicaciones debajo de eso.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-24 09:03:36
Podemos establecerlo en el 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;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-28 10:43:42
En la bota de resorte 1.5:
Agregue la siguiente propiedad en application.properties
:
server.context-path=/demo
Nota: /demo
es la URL de la ruta de contexto.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-11 16:13:40
Servidor.contextPath= / mainstay
Funciona para mí si tuviera un archivo war en JBOSS. Entre múltiples archivos de guerra 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"?>
<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>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-01 13:08:22
Tenga en cuenta que el "servidor.context-path " or " server.servlet.context-path "[a partir de springboot 2.0.x] las propiedades solo funcionarán si está implementando en un contenedor incrustado, por ejemplo, tomcat incrustado. Estas propiedades no tendrán efecto si está implementando su aplicación como war en un tomcat externo, por ejemplo.
Vea esta respuesta aquí: https://stackoverflow.com/a/43856300/4449859
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-02 14:47:59
La ruta de contexto se puede integrar directamente al código, pero no es aconsejable ya que no se puede reutilizar, por lo que debe escribirse en la aplicación.archivo de propiedades servidor.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.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-10 13:12:23