1

依存性注入のために 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 をマップするより良い方法はありますか?

4

2 に答える 2