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:
- Mueva el servletContainer (por lo tanto la configuración MainApiApplication.class) fuera del contexto secundario y
- 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