新たに追加されたFilter

【前提条件】

[環境]

【概要】

JAX-RS2.0から追加されたFilterを使います。
追加されたFilterは↓の4つです。

  • ClientRequestFilter
  • ClientResponseFilter
  • ContainerRequestFilter
  • ContainerResponseFilter

ClientRequestFilter、ClientResponseFilterは
ClientAPIが利用された時に呼び出されます。

ContainerRequestFilter、ContainerResponseFilterは
サーバサイドの処理が実行された時に呼び出されます。

今回はContainerRequestFilter、ContainerResponseFilterを
試しています。

【Filterクラスの実装】

import java.io.IOException;
import javax.ws.rs.client.ClientRequestContext;
import javax.ws.rs.client.ClientRequestFilter;
import javax.ws.rs.client.ClientResponseContext;
import javax.ws.rs.client.ClientResponseFilter;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.ext.Provider;

@Provider
public class SampleFilter implements ClientRequestFilter, ClientResponseFilter, ContainerRequestFilter, ContainerResponseFilter{

    @Override
    public void filter(ClientRequestContext requestContext) throws IOException {
        System.out.print("This method is ClientRequestFilter.");
    }

    @Override
    public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) throws IOException {
        System.out.print("This method is ClientResponseFilter.");
    }

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {
        System.out.print("This method is ContainerRequestFilter.");
    }

    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
        System.out.print("This method is ContainerResponseFilter.");
    }
    
}

おまけでClientFilterも実装して見ました。

Filterはそれぞれjavax.wr.rs.containerパッケージ、javax.wr.rs.clientパッケージ配下にあります。
インターフェイスにはfilterメソッドが定義されています。
今回はコンソールに出力する処理を実装しています。

javax.ws.rs.ext.Providerアノテーションを付与することにより、
全てのリソースクラスに対してFilterが実行されるようになります。

【その他のクラス】

Applicationクラスとリソースクラスは↓のようにしています。

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("/service")
public class BlogSampleApplication extends Application{

}
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.Response;

@Path("/filter")
public class FilterSampleResource {

    @GET
    public Response getResponse() {
        final String returhHtml = "<html><head><title>Filter Sample</title></head><body>Filter Sample</body></html>";
        
        return Response.ok(returhHtml).build();
    }
}

【実行してみる】

ブラウザからURLを入力して実行すると
コンソール上に↓の用にメッセージが表示されます。

This method is ContainerRequestFilter.
This method is ContainerResponseFilter.

ContainerRequestFilterとContainerResponseFilterの処理が
実行されていることがわかります。

今回はクライアントAPIは使用していないので、
ClientRequestFilterとClientResponseFilterは実行されません。