GlobalBidingとNameBiding

【前提条件】

[環境]

【概要】

今回は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を行うにはアノテーションを作成する必要があります。

作成するアノテーションにはjavax.ws.rs.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も同時に実行されています。