복붙노트

[SPRING] 스프링 부트와 함께 다중 디스패처 서블릿 / 웹 컨텍스트 사용

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)를 추가하려고합니다. 나는 두 가지 일을해야한다고 생각한다.

봄 부팅 방법은 무엇입니까?

해결법

  1. ==============================

    1.@ josh-ghiloni는 이미 말했듯이, 생성하고자하는 모든 격리 된 웹 컨텍스트에 대해 ServletRegistrationBean을 등록해야합니다. xml 또는 java config 클래스에서 응용 프로그램 컨텍스트를 만들어야합니다. @Import 및 @ComponentScan 주석을 사용하여 상위 컨텍스트에 공유 서비스를 추가 할 수 있습니다. 다음은 그 예입니다.

    @ josh-ghiloni는 이미 말했듯이, 생성하고자하는 모든 격리 된 웹 컨텍스트에 대해 ServletRegistrationBean을 등록해야합니다. xml 또는 java config 클래스에서 응용 프로그램 컨텍스트를 만들어야합니다. @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.서블릿과 그 매핑을 선언하는 ServletRegistrationBean을 생성하십시오. DispatcherServletAutoConfiguration을 호출 된 자동 구성에서 제외하고자 할 수도 있습니다. DispatcherServlet을 /에 등록하고 자신을 재정의 할 것이기 때문입니다

    서블릿과 그 매핑을 선언하는 ServletRegistrationBean을 생성하십시오. DispatcherServletAutoConfiguration을 호출 된 자동 구성에서 제외하고자 할 수도 있습니다. DispatcherServlet을 /에 등록하고 자신을 재정의 할 것이기 때문입니다

    편집 당신이 별도의 포트에서 실행되는 API를 필요로하지 않는 한 (그리고 그것은 당신처럼 보이지 않는다), Spring Boot의 저자 인 Dave Syer는 여기에서 매우 비슷한 질문에 답했다. : 스프링 부트로 여러 servletcontainers / servlet 구성

  3. from https://stackoverflow.com/questions/29096511/using-multiple-dispatcher-servlets-web-contexts-with-spring-boot by cc-by-sa and MIT license