我正在尝试使用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。 我不想在我的服务中硬编码“v1”,因为将来版本可能会改变(到“v2”)。
有人可以帮帮我吗?
谢谢, 保罗
答案 0 :(得分: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);
...
Jersey可以扫描多个包,其中列表以;
分隔也许你应该改变你的“api / *”终点,但我不确定泽西岛在这种情况下会如何运作。我敢打赌它可以正常使用这段代码。