web-dev-qa-db-ja.com

Spring Bootで複数のディスパッチャサーブレット/ Webコンテキストを使用する

親コンテキスト(サービス)と子コンテキスト(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)を追加します。私は2つのことをしなければならないと思います:

  1. ServletContainer(したがってMainApiApplication.class構​​成)を子コンテキストから移動し、
  2. パスマッピング/ one /-> ApiOne.classおよび/ two/ApiTwo.classを追加します

それを行うスプリングブーツの方法は何ですか?

22
Jan

@ josh-ghiloniが既に述べたように、作成したい分離されたWebコンテキストごとに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;
    }
}
28
Kamill Sokol

サーブレットとそのマッピングを宣言するServletRegistrationBeanを作成します。また、DispatcherServletAutoConfiguration/に登録して上書きするため、DispatcherServletを自動構成から除外することもできます。

[〜#〜] edit [〜#〜]以下の私のコメントにもかかわらず、APIを別のポートで実行する必要がない限り、 Spring Bootの作者の1人であるDave Syerがここで非常によく似た質問に答えました: Spring Bootで複数のservletcontainers/servletsを設定

8
Josh Ghiloni