Java 在spring boot中使用多个dispatcher servlet/web上下文
我创建了一个具有父上下文(服务)和子上下文(SpringWebMVC控制器)的SpringBoot应用程序: 现在我想为我的Java 在spring boot中使用多个dispatcher servlet/web上下文,java,spring,spring-mvc,servlets,spring-boot,Java,Spring,Spring Mvc,Servlets,Spring Boot,我创建了一个具有父上下文(服务)和子上下文(SpringWebMVC控制器)的SpringBoot应用程序: 现在我想为我的apitow.class配置添加另一个客户端上下文(和DispatcherServlet)。我想我必须做两件事: 将servletContainer(因此MainApiApplication.class配置)移出子上下文并 添加路径映射/one/->ApiOne.class和/two/ApiTwo.class spring启动的方式是什么?创建一个声明servlet及其映射
apitow.class
配置添加另一个客户端上下文(和DispatcherServlet)。我想我必须做两件事:
servletContainer
(因此MainApiApplication.class配置)移出子上下文并/one/->ApiOne.class
和/two/ApiTwo.class
spring启动的方式是什么?创建一个声明servlet及其映射的
ServletRegistrationBean
。您可能还希望从调用的自动配置中排除DispatcherServlet自动配置
,因为它将在/
处注册一个DispatcherServlet
,并覆盖您的配置
编辑尽管我在下面的评论中说您可能不需要它,除非您需要在单独的端口上运行API(而且听起来不像),Spring Boot的作者之一Dave Syer在这里回答了一个非常类似的问题:正如@josh ghiloni所说,您需要为每个要创建的独立web上下文注册一个
ServletRegistrationBean
。
您需要从xml或java配置类创建应用程序上下文。您可以使用@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;
}
}
你能举一个例子,包括ApiOne/Two.class上下文吗?另外,在当前我的服务注册的父上下文中,我应该将ServletRegistrationBean放在哪里?当我阅读您的问题时,我不确定您是否需要多个DispatcherServlets。这背后的原因是什么?您可以很容易地让两个Api
Controller
s彼此和谐共存。您只需将@RequestMapping(“/one”)
添加到ApiOne类,将@RequestMapping(“/two”)
添加到ApiTwo类。它们具有冲突的错误处理程序和消息转换器配置。我更愿意像几年前在基于web.xml的项目中那样将它们彼此分开。我明白了——你可能想阅读我当时链接的Dave的答案,这可能会对你有所帮助。我最初想分割悬赏,因为@josh ghiloni发布了最初的想法,但你的帖子更完整。因为这样做的目的是对一个问题有一个结论性的答案,我同意你。谢谢您的示例中唯一缺少的部分是添加Services.class上下文,您是否可以将其添加到@ksokol?我向上投票@josh ghiloni,以表明他的正确答案。要将服务添加到父上下文,您需要添加@Import({ServiceConfig1.class,ServiceConfig2.class})
或@ComponentScan(“my.package.service”)
。看看我的示例中的第一行to。ResourceConfig.class是什么?
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;
}
}