【问题标题】:Google Guice & Jersey multiple URL patterns to same servlet while applying package filtering应用包过滤时,Google Guice & Jersey 对同一个 servlet 的多个 URL 模式
【发布时间】:2013-05-10 06:06:37
【问题描述】:

我正在尝试使用 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/*" 开头的 URL 将由包“com.abc.web.stats.services”中的服务通过 servlet GuiceContainer 处理
  • 以 "/api/*" 开头的 URL 将由包“com.abc.web.stats.otherservices”中的服务通过相同的 servlet GuiceContainer 处理李>

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

有人可以帮帮我吗?

谢谢, 保罗

【问题讨论】:

    标签: java url jersey jetty guice


    【解决方案1】:

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

    ...
    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 可以扫描多个包,列表由 ; 分隔

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-18
      • 2012-07-23
      • 1970-01-01
      • 2018-09-20
      • 2013-09-29
      • 1970-01-01
      • 2019-03-06
      • 2011-12-14
      相关资源
      最近更新 更多