ひだまりソケットは壊れない

ソフトウェア開発に関する話を書きます。 最近は主に Android アプリ、Windows アプリ (UWP アプリ)、Java 関係です。

まじめなことを書くつもりでやっています。 適当なことは 「一角獣は夜に啼く」 に書いています。

JAX-RS アプリケーションで PreMatching フィルタを使ってリクエスト URL を書きかえる

JAX-RS アプリケーションを書いているときに、リクエストされた URI のパスを書きかえて、対応するリソースを書き替えたい場合があります。 そのような時には、PreMatching フィルタを使用できます。

例えば、リクエスト URI のパスがスラッシュで終わっている場合に、パスの末尾に 「.index」 などの文字を追加したいとしましょう。 その場合は次のようなフィルタを書けばよいです。

package info.vividcode.example;

import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.container.PreMatching;
import javax.ws.rs.core.UriBuilder;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.ext.Provider;

/**
 * リクエスト URI のパスがスラッシュで終わっている場合に、パスの末尾に 「.index」 を追加するフィルタ。
 * 末尾のスラッシュの有無に応じて、ディスパッチされるリソースを別にするため。
 */
@Provider
@PreMatching
public class IndexPathAddingFilter implements ContainerRequestFilter {
    @Override
    public void filter(ContainerRequestContext requestContext) {
        UriInfo uriInfo = requestContext.getUriInfo();
        if (uriInfo.getPath(false).endsWith("/")) {
            UriBuilder uriBuilder = UriBuilder.fromUri(uriInfo.getRequestUri());
            uriBuilder.path(".index");
            requestContext.setRequestUri(uriBuilder.build());
        }
    }
}

JAX-RS では、パスの末尾にスラッシュがあってもなくても同じリソースにマッチするので、パスの末尾にスラッシュがあるかどうかでマッチするリソースを変えたい場合には上のようにするのも 1 つの手だと思います。