java - mundo - spring boot tomcat configuration
Agregar ruta de contexto a la aplicaciĆ³n Spring Boot (9)
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<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 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 properties .
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).
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.
En Spring Boot, para cambiar la ruta de contexto, actualice las propiedades server.contextPath. Los siguientes ejemplos actualizan la ruta de contexto desde / a / mkyong o http://localhost:8080/mkyong
Nota De forma predeterminada, la ruta de contexto es "/".
1.1 Actualización a través de un archivo de propiedades.
/src/main/resources/application.properties
server.port = 8080
server.contextPath = / mkyong
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.
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;
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
.yml
.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
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"?>
<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>