Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在spring boot中使用多个dispatcher servlet/web上下文_Java_Spring_Spring Mvc_Servlets_Spring Boot - Fatal编程技术网

Java 在spring boot中使用多个dispatcher servlet/web上下文

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及其映射

我创建了一个具有父上下文(服务)和子上下文(SpringWebMVC控制器)的SpringBoot应用程序:

现在我想为我的
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;
        }
    }