在 spring 启动时使用多个调度程序 servlets / web 上下文
Using multiple dispatcher servlets / web contexts with spring boot
我创建了一个 spring 具有父上下文(服务)和子上下文(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();
}
}
现在我想为我的 ApiTwo.class
配置添加另一个客户端上下文(和 DispatcherServlet)。我想我必须做两件事:
- 将
servletContainer
(因此 MainApiApplication.class 配置)移出子上下文并
- 添加路径映射
/one/ -> ApiOne.class
和/two/ ApiTwo.class
spring 启动方式是什么?
创建一个 ServletRegistrationBean
来声明 servlet 及其映射。您可能还想从调用的自动配置中排除 DispatcherServletAutoConfiguration
,因为它将在 /
注册一个 DispatcherServlet
并覆盖您的
EDIT 尽管我在下面的评论中说你可能不需要这个,除非你需要你的 API 运行 在不同的端口上(这听起来不像你这样做), Dave Syer,Spring Boot 的作者之一,在这里回答了一个非常相似的问题:Configure multiple servletcontainers/servlets with spring boot
正如@josh-ghiloni 已经说过的,您需要为每个要创建的独立 Web 上下文注册一个 ServletRegistrationBean
。
您需要从 xml 或 java 配置 class 创建应用程序上下文。您可以使用 @Import
和 @ComponentScan
注释将共享服务添加到父上下文。这是一个例子:
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;
}
}
我创建了一个 spring 具有父上下文(服务)和子上下文(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();
}
}
现在我想为我的 ApiTwo.class
配置添加另一个客户端上下文(和 DispatcherServlet)。我想我必须做两件事:
- 将
servletContainer
(因此 MainApiApplication.class 配置)移出子上下文并 - 添加路径映射
/one/ -> ApiOne.class
和/two/ ApiTwo.class
spring 启动方式是什么?
创建一个 ServletRegistrationBean
来声明 servlet 及其映射。您可能还想从调用的自动配置中排除 DispatcherServletAutoConfiguration
,因为它将在 /
注册一个 DispatcherServlet
并覆盖您的
EDIT 尽管我在下面的评论中说你可能不需要这个,除非你需要你的 API 运行 在不同的端口上(这听起来不像你这样做), Dave Syer,Spring Boot 的作者之一,在这里回答了一个非常相似的问题:Configure multiple servletcontainers/servlets with spring boot
正如@josh-ghiloni 已经说过的,您需要为每个要创建的独立 Web 上下文注册一个 ServletRegistrationBean
。
您需要从 xml 或 java 配置 class 创建应用程序上下文。您可以使用 @Import
和 @ComponentScan
注释将共享服务添加到父上下文。这是一个例子:
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;
}
}