2015-05-18 15 views
12

ho una struttura seguente progetto diStivale Primavera servletDispatchers a più moduli

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

Platform è il progetto che contiene la classe di inizio primavera-boot, piattaforma ha una dipendenza da config e config aveva dipendenze tutto nella directory modules Platform è anche il modulo che inizia con il comando mvn spring-boot: run.

La cosa che sto cercando di realizzare è che i moduli di amministrazione e web (entrambe le applicazioni web) hanno la loro mappatura come

    /
  • amministratore
  • /web

Il codice seguente rappresenta un controller nel modulo admin, il modulo web contiene anche un controller simile (questo è il punto)

@Controller 
public class AdminController { 

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

Qui po 'di codice per la configurazione del modulo di amministrazione

@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"); 
} 
} 

Qualcosa di simile vale per il modulo web

Ho provato il implementare l'alcune delle risposte date.

  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. E un sacco di googling

Quando ho lasciato la scansione dei componenti, la scansione di entrambi i moduli (rimuovendo il filtro ComponentScan)

ottengo un una mappatura Ambiguo trovato eccezione, dicendo che entrambi i metodi del controllore inviano allo stesso percorso "/"

Ma quando si disabilita la scansione dei componenti su uno dei moduli, allora i moduli di amministrazione vengono mappati su/admin.

quando disattivo entrambi i controller, vedo che i dispatchServlet/web e/admin vengono mappati.

Quindi ho capito l'eccezione ma non capisco come risolvere questo problema. Per me è un must che posso fare questo per modulo e io non voglio mappare utilizzando

@RequestMapping("/admin") 

sulla classe controller

Ho provato anche specificare il contextPath e servletPath nelle application.properties

Quindi la mia domanda è: quale sarebbe l'approccio migliore per raggiungere il mio obiettivo, o sto cercando di usare spring-boot per qualcosa per cui non era adatto.

Modifica una prova di concetto sarebbe bello

risposta

4

Quindi ho trovato la soluzione. Puoi dare un'occhiata a questo link

È necessario registrare i servlet di dispatcher nell'applicazione principale e non utilizzare l'annotazione @SpringBootApplication.

Per un esempio completo solo checkout del progetto e controllare il codice

EDIT: fine di questa settimana malato fornire una risposta dettagliata

0

cosa si dovrebbe fare è che mettere il vostro AdminController e WebController in pacchetti separati.

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

E nelle configurazioni corrispondenti scansione solo il pacchetto richiesto di registrare il DispatcherServlet

Admin Config

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

Web Config

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

In questo modo nel corrispondente WebApplicationContext per ogni DispatcherServlet solo o ne mappatura sarà disponibile per "/"

+0

li ho in pacchetti separati, moduli separati anche. e l'approccio di scansione non ha funzionato neanche per me. –