2013-05-15 10 views
6

Próbuję, używając Jersey & Google Guice 3.0, mapować 2 różne wzorce adresów URL do tego samego serwletu i każdego z tych wzorców adresów URL, które mają być zastosowane do innego pakiet w moim projekcie.Google Guice & Jersey wiele wzorców adresów URL do tego samego serwletu podczas stosowania filtrowania pakietów

Aby było jasne, wklejam część kodu poniżej, a także wyjaśnię.

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); 
      } 
     } 
    } 
... 
} 

Więc zasadniczo chcę:

  • adresy zaczynające się od "/ api/v1/*" do obsługi za pomocą serwletu GuiceContainer według usług w pakiecie "com.abc.web.stats. usługi
  • adresy URL zaczynające «/ api/*» być obsługiwane przez samego serwletu GuiceContainer przez usługi w pakiecie” com.abc.web.stats. otherservices

użyłem kodu powyżej, ale nie wydaje się do pracy, wydaje się, że tylko pierwsza«służyć»rozmowa jest brane pod uwagę, więc w tym przypadku tylko adresy URL pasujące”/api/v1/*”są podawane. nie chcę hardcode«v1»w moich usług od wersji może się zmienić (z«v2») w przyszłości.

Czy ktoś mógłby mi pomóc?

Dzięki, Paul

Odpowiedz

2

Maj być twoje obecne punkty końcowe powinny być refaktoryzowane, ale w każdym razie twój kod wygląda bardziej skomplikowany niż to konieczne. W moim przypadku działa tak.

... 
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 może skanować wiele pakietów z listą oddzieloną;

Może powinieneś zmienić swój punkt końcowy "api/*", ale nie jestem pewien, jak Jersey będzie działał w tej sytuacji. Mogę się założyć, że działa dobrze z tym kodem.

Powiązane problemy