依存性注入のために jersey と guice を使用して REST API をまとめました。私は 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);
}
});
}
}
MyService.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 + "\"}";
}
}
サービス名の前に//を含むリクエストが実際にはサーブレットによって処理されていないことが問題であることがわかります。これは、フィルターマッピングのURLマッピングで一致していないためですが、よくわかりません正しい解決策。その URL がサーブレットに一致する前に、URL を書き換える必要がありますか? または、要求 URL をマップするより良い方法はありますか?