www tutorial org mvc ecosystem community java spring spring-mvc servlets spring-boot

java - tutorial - Uso de mĂșltiples servlets/contextos web de dispatcher con Spring Boot



spring security tutorial (2)

Como @ josh-ghiloni ya dijo, debe registrar un ServletRegistrationBean para cada contexto web aislado que desee crear. Debe crear un contexto de aplicación a partir de una clase de configuración xml o java. Puede usar la anotación @Import y @ComponentScan para agregar servicios compartidos al contexto principal. Aquí hay un ejemplo:

import org.springframework.boot.SpringApplication; import org.springframework.boot.context.embedded.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; import org.springframework.web.context.support.XmlWebApplicationContext; import org.springframework.web.servlet.DispatcherServlet; //@ComponentScan({"..."}) //@Import({}) public class Starter { public static void main(String[] args) throws Exception { SpringApplication.run(Starter.class, args); } @Bean public ServletRegistrationBean apiV1() { DispatcherServlet dispatcherServlet = new DispatcherServlet(); XmlWebApplicationContext applicationContext = new XmlWebApplicationContext(); applicationContext.setConfigLocation("classpath:/META-INF/spring/webmvc-context.xml"); dispatcherServlet.setApplicationContext(applicationContext); ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(dispatcherServlet, "/api/1/*"); servletRegistrationBean.setName("api-v1"); return servletRegistrationBean; } @Bean public ServletRegistrationBean apiV2() { DispatcherServlet dispatcherServlet = new DispatcherServlet(); AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext(); applicationContext.register(ResourceConfig.class); dispatcherServlet.setApplicationContext(applicationContext); ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(dispatcherServlet, "/api/2/*"); servletRegistrationBean.setName("api-v2"); return servletRegistrationBean; } }

Creé una aplicación Spring Boot con un contexto primario (servicios) y un contexto secundario (controladores spring-webmvc):

@Configuration public class MainApiApplication { public static void main(String[] args) { new SpringApplicationBuilder() .parent(Services.class) .child(ApiOne.class, MainApiApplication.class) .run(args); } @Bean public EmbeddedServletContainerFactory servletContainer() { return new TomcatEmbeddedServletContainerFactory(); } }

Ahora quiero agregar otro contexto de cliente (y DispatcherServlet) para mi configuración de ApiTwo.class. Creo que tengo que hacer dos cosas:

  1. Mueva el servletContainer (por lo tanto la configuración MainApiApplication.class) fuera del contexto secundario y
  2. agregar una asignación de ruta / one / -> ApiOne.class y / two / ApiTwo.class

¿Cuál es la forma de arranque de primavera para hacerlo?


Cree un ServletRegistrationBean que declare el servlet y sus asignaciones. Probablemente también querrá excluir DispatcherServletAutoConfiguration de las autoconfiguraciones llamadas, ya que registrará un DispatcherServlet en / y anulará el suyo.

EDITAR A pesar de que mi comentario a continuación dice que podría no necesitar esto, a menos que necesite que sus API se ejecuten en puertos separados (y no suena como lo hace), Dave Syer, uno de los autores de Spring Boot, respondió a una pregunta muy similar : Configure múltiples servletcontainers / servlets con el arranque por resorte