[英]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);
}
}
}
...
}
所以基本上我想要:
我使用了上面的代码,但似乎没有用,似乎只考虑了第一个“ 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.