親コンテキスト(サービス)と子コンテキスト(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つのことをしなければならないと思います:
それを行うスプリングブーツの方法は何ですか?
@ 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;
}
}
サーブレットとそのマッピングを宣言するServletRegistrationBean
を作成します。また、DispatcherServletAutoConfiguration
を/
に登録して上書きするため、DispatcherServlet
を自動構成から除外することもできます。
[〜#〜] edit [〜#〜]以下の私のコメントにもかかわらず、APIを別のポートで実行する必要がない限り、 Spring Bootの作者の1人であるDave Syerがここで非常によく似た質問に答えました: Spring Bootで複数のservletcontainers/servletsを設定