gpt4 book ai didi

java - Google Guice & Jersey 在应用程序包过滤时对同一个 servlet 的多个 URL 模式

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:29:37 25 4
gpt4 key购买 nike

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

有人可以帮帮我吗?

谢谢,保罗

最佳答案

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

...
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 在这种情况下将如何工作。我敢打赌,这段代码可以正常工作。

关于java - Google Guice & Jersey 在应用程序包过滤时对同一个 servlet 的多个 URL 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16568939/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com