有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在spring引导下使用多个dispatcher servlet/web上下文

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

@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)。我想我必须做两件事:

  1. servletContainer(因此是MainApiApplication.class配置)移出子上下文并
  2. 添加路径映射/one/ -> ApiOne.class/two/ ApiTwo.class

spring boot的方法是什么


共 (2) 个答案

  1. # 1 楼答案

    正如@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;
        }
    }
    
  2. # 2 楼答案

    创建一个声明servlet及其映射的ServletRegistrationBean。您可能还想从调用的自动配置中排除DispatcherServletAutoConfiguration,因为它将在/注册一个DispatcherServlet并覆盖您的

    编辑尽管我在下面的评论中说您可能不需要它,除非您需要在单独的端口上运行API(而且听起来不像),Spring Boot的作者之一Dave Syer在这里回答了一个非常类似的问题:Configure multiple servletcontainers/servlets with spring boot