2015-05-18 16 views
12

Ich habe eine folgende ProjektstrukturFrühling Boot-Multi-Modul servletDispatchers

-Project 
|-config 
| |-modules 
|  |-admin 
|  |-web 
|- platform 

Platform ist das Projekt, das die Feder-Boot-Startklasse enthält, Platform eine Abhängigkeit von der Konfiguration hat und Config hatte Abhängigkeiten auf allem im Verzeichnis Module Platform ist auch das Modul, das mit dem Befehl mvn spring-boot: run gestartet wird.

Das, was ich zu tun versuche, ist, dass die Module Admin und Web (beiden Web-Anwendungen), um ihr eigenes Mapping wie

  • /admin haben
  • /web

Der folgende Code stellt einen Controller im Admin-Modul dar, das Web-Modul enthält auch einen ähnlichen Controller (das ist der Punkt)

@Controller 
public class AdminController { 

    @RequestMapping("/") 
    public String adminController() { 
     return "admin"; 
    } 
} 

Hier einige Code für die Konfiguration der Admin-Modul

@Configuration 
public class Config implements EmbeddedServletContainerCustomizer { 

@Autowired 
protected WebApplicationContext webApplicationContext; 

@Autowired 
protected ServerProperties server; 

@Autowired(required = false) 
protected MultipartConfigElement multipartConfig; 

protected DispatcherServlet createDispatcherServlet() { 

    AnnotationConfigEmbeddedWebApplicationContext webContext = new AnnotationConfigEmbeddedWebApplicationContext(); 
    webContext.setParent(webApplicationContext); 
    webContext.scan("some.base.package"); 
    return new DispatcherServlet(webContext); 
} 

protected ServletRegistrationBean createModuleDispatcher(DispatcherServlet apiModuleDispatcherServlet) { 
    ServletRegistrationBean registration = 
      new ServletRegistrationBean(apiModuleDispatcherServlet, 
        "/admin"); 

    registration.setName("admin"); 
    registration.setMultipartConfig(this.multipartConfig); 

    return registration; 
} 


@Bean(name = "adminsServletRegistrationBean") 
public ServletRegistrationBean apiModuleADispatcherServletRegistration() { 
    return createModuleDispatcher(createDispatcherServlet()); 
} 

public void customize(ConfigurableEmbeddedServletContainer container) { 
    container.setContextPath("/admin"); 
} 
} 

Etwas Ähnliches gilt für den Web-Modul

ich versucht habe, die die einige der gegebenen Antworten zu implementieren.

  1. Using multiple dispatcher servlets/web contexts with spring boot
  2. Spring Boot (JAR) with multiple dispatcher servlets for different REST APIs with Spring Data REST
  3. Und viele

googeln Wenn ich die Komponente Scan lassen, scannen beide Module (Entfernen des ComponentScan Filter)

ich eine bekommen eine mehrdeutige Abbildung Ausnahme gefunden, die besagt, dass beide Controller-Methoden zum selben Pfad "/"

senden

Wenn Sie jedoch den Komponenten-Scan auf einem der Module deaktivieren, werden die Admin-Module tatsächlich zu/admin zugeordnet.

Wenn ich beide Controller deaktiviere, sehe ich, dass die/web und/admin dispatchServlets zugeordnet werden.

Also ich verstehe die Ausnahme, aber ich verstehe nicht, wie das zu lösen ist. Für mich ist es ein Muss, dass ich das pro Modul tun kann, und ich will nicht, dass es zur Karte

@RequestMapping("/admin") 

auf dem Controller-Klasse

Ich habe auch versucht die contextPath und servletPath in den application.properties Angabe

Also meine Frage ist: Was wäre der beste Ansatz, um mein Ziel zu erreichen, oder versuche ich Spring-Boot für etwas zu verwenden, für das es nicht vorgesehen war.

bearbeiten Ein Proof-of-Concept würde

Antwort

4

verfügbar sein Also habe ich die Lösung gefunden. Sie können an diesem

link einen Blick hier nehmen Sie `ll die Dispatcher-Servlets in der Hauptanwendung registrieren und nicht die @SpringBootApplication Anmerkung verwenden.

Ein vollständiges Beispiel nur das Projekt Kasse und die

EDIT Code überprüfen: später in dieser Woche krank geben Sie eine detaillierte Antwort

0

Was schön, Sie tun sollten, dass in separaten Paketen setzen Sie Ihre Admincontroller und WebController ist.

some.base.admin.package 
some.base.web.package 

und in den entsprechenden Konfigurationen scannen nur Ihr erforderliches Paket das DispatcherServlet

Admin Config

webContext.scan("some.base.admin.package"); 

Web Config

webContext.scan("some.base.web.package"); 

diese Weise in die entsprechenden WebApplicationContext für registrieren jeweils DispatcherServlet nur o ne Mapping wird für "/"

+0

ich sie in separaten Paketen haben, separate Module selbst. und der Scan-Ansatz funktionierte auch nicht für mich. –