我有一个 REST api,使用 jersey 和 guice 进行依赖注入。一切都很好,我打开了 FEATURE_CANONICALIZE_URI_PATH 和 FEATURE_NORMALIZE_URI 并且在几乎所有情况下都可以处理额外的斜杠。例如:
http://localhost:8080/my_service/param1//param2
问题是我无法找出正确的方法来处理 url 开头的额外斜杠(在服务路径之前)。像这样:
http://localhost:8080//my_service/param1/param2
这就是我目前设置东西的方式:
web.xml
<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>
<listener>
<listener-class>MyServletConfig</listener-class>
</listener>
MyServletConfig.java
public class MyServletConfig extends GuiceServletContextListener {
@Override
protected Injector getInjector() {
return Guice.createInjector(new JerseyServletModule() {
@Override
protected void configureServlets() {
bind(MyService.class);
guiceContainerConfig.put(ResourceConfig.FEATURE_NORMALIZE_URI, "true");
guiceContainerConfig.put(ResourceConfig.FEATURE_CANONICALIZE_URI_PATH, "true");
serve("/*").with(GuiceContainer.class, guiceContainerConfig);
}
});
}
}
我的服务.java
@Path("/")
public class MyService {
@GET
@Path("/{param1}/{param2}")
@Produces("application/json")
public String get(
@PathParam("param1") final String param1,
@PathParam("param2") final String param2) {
return "{\"param1\":\"" + param1 + "\"}";
}
}
我可以看到问题实际上是在服务名称之前带有 // 的请求实际上并没有被 servlet 处理,因为它在过滤器映射的 url-mapping 中不匹配,但我只是不太确定正确的解决方案。在该 url 与 servlet 匹配之前,我是否需要进行 url 重写,或者是否有更好的方法来映射请求 url?