J'ai créé une application Spring Boot avec un contexte parent (services) et un contexte enfant (contrôleurs 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();
}
}
Maintenant, je veux ajouter un autre contexte client (et DispatcherServlet) pour ma configuration ApiTwo.class. Je pense que je dois faire deux choses:
Quelle est la façon de démarrer le printemps pour le faire?
Comme @ josh-ghiloni l'a déjà dit, vous devez enregistrer un ServletRegistrationBean
pour chaque contexte Web isolé que vous souhaitez créer. Vous devez créer un contexte d'application à partir d'un fichier xml ou Java. Vous pouvez utiliser @Import
et @ComponentScan
annotation pour ajouter des services partagés au contexte parent. Voici un exemple:
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;
}
}
Créez un ServletRegistrationBean
qui déclare le servlet et ses mappages. Vous souhaiterez probablement également exclure DispatcherServletAutoConfiguration
des autoconfigurations appelées, car il enregistrera un DispatcherServlet
dans /
et remplacez le vôtre
[~ # ~] modifier [~ # ~] Malgré mon commentaire ci-dessous, vous pourriez ne pas en avoir besoin, sauf si vous avez besoin que vos API s'exécutent sur des ports distincts ( et cela ne vous ressemble pas), Dave Syer, l'un des auteurs de Spring Boot, a répondu à une question très similaire ici: Configurer plusieurs servletcontainers/servlets avec spring boot