JAX-RS アプリケーションで PreMatching フィルタを使ってリクエスト URL を書きかえる
JAX-RS アプリケーションを書いているときに、リクエストされた URI のパスを書きかえて、対応するリソースを書き替えたい場合があります。 そのような時には、PreMatching フィルタを使用できます。
- JAX-RS 2.0 のドキュメント: JSR-000339 JAX-RS 2.0 - Final Release
- フィルタについては 6.2 節 「Filters」 に書いてあります。
- Jersey の Filter のドキュメント: Chapter 9. Filters and Interceptors
例えば、リクエスト 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 つの手だと思います。