GlobalBidingとNameBiding
【前提条件】
[参考資料]
JavaEE7 JavaDoc
Java(TM) EE 7 Specification APIs
JAX-RS2.0 仕様書
The Java Community Process(SM) Program - communityprocess - final
【概要】
今回はGlobalBindingとNameBidingについてまとめてみました。
Filterを使用する場合、Providerアノテーションを使用しますが、
Providerアノテーションの場合、全てのリソースクラスが対象となります。
特定のリソースクラスを対象とする場合は
NameBidingを使用します。
【アノテーションの定義】
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import javax.ws.rs.NameBinding; @NameBinding @Target({ ElementType.TYPE, ElementType.METHOD }) @Retention(RetentionPolicy.RUNTIME) public @interface BindingSample { }
NameBindingを行うにはアノテーションを作成する必要があります。
【Filterクラス】
まずはGlobalBidingのFilterクラスです。
import java.io.IOException; 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 GlobalBindingFilter implements ContainerRequestFilter, ContainerResponseFilter{ @Override public void filter(ContainerRequestContext requestContext) throws IOException { System.out.println("Global binding request filter"); } @Override public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException { System.out.println("Global binding response filter"); } }
Providerアノテーションを付与しているだけです。
次にNameBindingのFilterクラスです。
import java.io.IOException; 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; import jp.glory.annotation.BindingSample; @Provider @BindingSample public class NameBindingFilter implements ContainerRequestFilter, ContainerResponseFilter{ @Override public void filter(ContainerRequestContext requestContext) throws IOException { System.out.println("Name binding request filter"); } @Override public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException { System.out.println("Name binding response filter"); } }
先ほど作成したアノテーションを付与しています。
それ以外はGlobalBindingと同じです。
【リソースクラス】
import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.core.Response; import jp.glory.annotation.BindingSample; @Path("/NameBinding") @BindingSample public class NameBindingResource { @GET public Response getResponse() { final String returhHtml = "<html><head><title>Name Binding</title></head><body>Name Binding</body></html>"; return Response.ok(returhHtml).build(); }
先ほど作成したアノテーションをリソースクラスにも付与します。
これでNameBindingの設定は完了です。
実行用の比較用としてNameBiding対象ではないリソースクラスも準備します。
import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.core.Response; @Path("/GlobalBinding") public class GlobalBindingResource { @GET public Response getResponse() { final String returhHtml = "<html><head><title>Global Binding</title></head><body>Global Binding</body></html>"; return Response.ok(returhHtml).build(); } }
【実行結果】
まずはGlobalBiding対象のリソースクラスの実行結果からです。
Global binding request filter Global binding response filter
GlobalBidingFilterのみが実行されていることがわかります。
次はNameBiding対象のリソースクラスの実行結果です。
Global binding request filter Name binding request filter Global binding response filter Name binding response filter
NameBidingFilterが実行されていることがわかります。
同時にGlobalBidingも同時に実行されています。