应用包过滤时,Google Guice&Jersey将多个URL模式应用于同一个servlet

Pau*_*scu 6 java url jetty jersey guice

我正在尝试使用Jersey和Google Guice 3.0将2种不同的URL模式映射到同一个servlet,并将这些URL模式中的每一个应用于我项目中的不同包.

为了清楚起见,我正在粘贴下面的部分代码,我也会解释.

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>
Run Code Online (Sandbox Code Playgroud)

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);
            }
        }
    }
...
}
Run Code Online (Sandbox Code Playgroud)

基本上我想要:

  • "/ api/v1/*"开头的URL 将通过servlet GuiceContainer由"com.abc.web.stats.services " 包中的服务处理
  • 开头的URL "/ API/*"将通过同一个servlet GuiceContainer通过一揽子服务处理"com.abc.web.stats.otherservices "

我使用上面的代码,但它似乎不起作用,似乎只考虑了第一个"服务"调用,所以在这种情况下只提供匹配"/ api/v1/*"的URL.我不想在我的服务中硬编码"v1",因为将来版本可能会改变(到"v2").

有人可以帮帮我吗?

谢谢,保罗

小智 2

也许您当前的端点应该重构,但无论如何您的代码看起来比必要的要复杂一些。就我而言,它是这样工作的。

...
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);
...
Run Code Online (Sandbox Code Playgroud)

Jersey 可以扫描多个包裹,并用 ; 分隔列表。

也许您应该更改您的“api/*”端点,但我不太确定 Jersey 在这种情况下将如何工作。我敢打赌,这段代码可以正常工作。