web-dev-qa-db-fra.com

Utilisation de plusieurs servlets de répartiteur / contextes Web avec Spring Boot

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:

  1. Déplacez le servletContainer (donc la configuration MainApiApplication.class) hors du contexte enfant et
  2. ajouter un mappage de chemin/un/-> ApiOne.class et/deux/ApiTwo.class

Quelle est la façon de démarrer le printemps pour le faire?

22
Jan

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;
    }
}
28
Kamill Sokol

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

8
Josh Ghiloni