繁体   English   中英

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

[英]Google Guice & Jersey multiple URL patterns to same servlet while applying package filtering

我正在尝试使用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>

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

所以基本上我想要:

  • “/ API / V1 / *”通过servlet的GuiceContainer通过一揽子服务来处理“com.abc.web.stats。 服务 ”的网址
  • “/ API / *”将通过一揽子服务,通过同一个servlet处理GuiceContainer“com.abc.web.stats。otherservices”网址

我使用了上面的代码,但似乎没有用,似乎只考虑了第一个“ serve”调用,因此在这种情况下,仅提供匹配“ / api / v1 / *”的URL。 我不想在服务中对“ v1”进行硬编码,因为将来版本可能会更改(更改为“ v2”)。

有人可以帮我吗?

谢谢保罗

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

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

泽西可以扫描多个包,列表中间用;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM