2013-05-15 11 views
6

Sto provando, utilizzando Jersey & Google Guice 3.0, per mappare 2 diversi pattern URL allo stesso servlet e ognuno di questi pattern URL da applicare a un altro pacchetto nel mio progetto.Google Guice e Jersey più pattern URL per lo stesso servlet durante l'applicazione del filtro pacchetti

Per essere chiari, sto incollando parte del codice qui sotto e spiegherò anche.

web.xml

<listener> 
    <listener-class>com.abc.web.listeners.GuiceContextListener</listener-class> 
</listener> 
<filter> 
    <filter-name>guiceFilter</filter-name> 
    <filter-class>com.google.inject.servlet.GuiceFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>guiceFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

GuiceContextListener

public final class GuiceContextListener extends GuiceServletContextListener { 
... 
    private JerseyServletModule getJerseyServletModule() { 
     JerseyServletModule jerseyModule = new JerseyServletModule() { 
      @Override 
      protected void configureServlets() { 
       filter("/*").through(WebServerStateFilter.class); 
       final Map<String, String> params = new HashMap<String, String>(); 
       StringBuilder sb = new StringBuilder(); 
       sb.append("com.abc.web.stats.services"); 
       params.put(PackagesResourceConfig.PROPERTY_PACKAGES, sb.toString()); 
       serve("/api/v1/*").with(GuiceContainer.class, params); 

       final Map<String, String> params1 = new HashMap<String, String>(); 
       StringBuilder sb1 = new StringBuilder(); 
       sb1.append("com.abc.web.stats.otherservices"); 
       params1.put(PackagesResourceConfig.PROPERTY_PACKAGES, sb1.toString()); 
       serve("/api/*").with(GuiceContainer.class, params1); 
      } 
     } 
    } 
... 
} 

Quindi, fondamentalmente voglio:

  • URL inizia con "/ api/v1/*" da gestire tramite servlet GuiceContainer dai servizi nel pacchetto "com.abc.web.stats. servizi "
  • URL che iniziano con "/ API/*" ad essere gestite tramite lo stesso GuiceContainer servlet dai servizi a pacchetto" com.abc.web.stats. otherservices "

ho usato il codice di cui sopra, ma non sembra funzionare, sembra che solo il primo 'servire' chiamata viene presa in considerazione in modo in questo caso solo gli URL matching"/api/v1/*" sono serviti. io non voglio hardcode 'v1' nei miei servizi dal momento che la versione potrebbe cambiare (in 'v2') in futuro.

qualcuno può darmi una mano?

Grazie, Paul

risposta

2

Maggio essere i tuoi attuali endpoint dovrebbero essere refactored, ma in ogni caso il tuo codice sembra un po 'più complicato di quanto necessario. Nel mio caso funziona così.

... 
String packages = "com.abc.web.stats.services;com.abc.web.stats.otherservices"; 
params.put(PackagesResourceConfig.PROPERTY_PACKAGES, packages); 

serve("/api/v1/*").with(GuiceContainer.class, params); 
serve("/api/*").with(GuiceContainer.class, params); 
... 

Jersey può eseguire la scansione di più pacchetti con un elenco separato da;

Forse dovresti cambiare il tuo endpoint "api/*" ma non sono molto sicuro di come Jersey funzionerà in quella situazione. Potrei scommettere che funziona bene con questo codice.

Problemi correlati