programing

스프링 부트에서 여러 디스패처 서블릿/웹 컨텍스트 사용

oldcodes 2023. 3. 5. 10:24
반응형

스프링 부트에서 여러 디스패처 서블릿/웹 컨텍스트 사용

부모 콘텍스트(서비스)와 자녀 콘텍스트(스프링 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();
    }

}

이제 다른 클라이언트 컨텍스트(및 Dispatcher Servlet)를 추가합니다.ApiTwo.class배열.두 가지 일을 해야 할 것 같아요.

  1. 를 이동하다servletContainer(따라서 MainApiApplication.class Configuration)을 자 컨텍스트에서 제외됩니다.
  2. 경로 매핑 추가/one/ -> ApiOne.class그리고./two/ ApiTwo.class

그것을 하기 위한 스프링 부츠 방법은 무엇입니까?

@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;
    }
}

작성하다ServletRegistrationBean서블릿과 그 매핑을 선언합니다.또한 아마도 제외하기를 원할 것입니다.DispatcherServletAutoConfiguration콜된 자동 설정으로부터, 콜된 자동 설정을 사용해 주세요.DispatcherServlet/자신의 것을 덮어쓰다

편집 다른 포트에서 API를 실행할 필요가 없는 경우(그렇게 들리지 않는 경우) 아래 코멘트가 필요 없을 수 있다는 제 의견에도 불구하고, Spring Boot의 저자 중 한 명인 Dave Syer는 매우 유사한 질문에 답했습니다: Spring Boot에서 여러 서블릿 컨테이너/서블릿을 설정합니다.

언급URL : https://stackoverflow.com/questions/29096511/using-multiple-dispatcher-servlets-web-contexts-with-spring-boot

반응형