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?

Author: nbro, 2013-12-05

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).

 280
Author: M. Deinum,
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

  1. .yml

  2. .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

 24
Author: Abhishek Shah,
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
 11
Author: magemello,
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.

 5
Author: Michael Simons,
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;
 2
Author: Sanket,
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.

 1
Author: Piyush Anjikar,
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>
 0
Author: Gondri,
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

 0
Author: abdel,
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.

 -1
Author: saravanan,
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