JAX-RSをやってみる (7) - Reader & Writer interceptor -

2014-06-14T00:00:00+00:00 Java JAX-RS

公式ドキュメント先: https://jersey.java.net/documentation/latest/user-guide.html#filters-and-interceptors

リクエストなりレスポンスなりで処理される前後になんらかの処理をしたい場合にInterceptorが使える模様。それとInterceptorは普通に定義しちゃうとグローバルに作業してしまう件に関しては@NameBindingを使ったアノテーションを定義する事で、そのアノテーションがついている場合にのみ作動するような仕組みを利用する事も可能

Sample.java (NameBindingを使ったアノテーション)

package sample.interceptor;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import javax.ws.rs.NameBinding;

@NameBinding
@Retention(RetentionPolicy.RUNTIME)
public @interface Sample {
}

SampleWriterInterceptor.java

package sample.interceptor;

import java.io.IOException;

import javax.ws.rs.WebApplicationException;
import javax.ws.rs.ext.Provider;
import javax.ws.rs.ext.WriterInterceptor;
import javax.ws.rs.ext.WriterInterceptorContext;

@Provider
@Sample
public class SampleWriterInterceptor implements WriterInterceptor {

    @Override
    public void aroundWriteTo(WriterInterceptorContext context)
        throws IOException, WebApplicationException {

        // before

        context.proceed();

        // after
    }
}

Home.java

package sample.controller;

import javax.ws.rs.BeanParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;

import sample.bean.SampleBean;
import sample.interceptor.Sample;

@Path("/sample")
public class Home {

    @POST
    @Path("save")
    @Sample
    public String save(@BeanParam SampleBean bean) {
        return bean.getName();
    }
}

っていうようにコントローラーとなるメソッドで@NameBindingで指定されているメソッドであればInterceptorが発動するようになる。逆に指定しない場合にはInterceptorは発動しない模様

JAX-RSをやってみる (8) - DynamicFeature - JAX-RSをやってみる (6) - 例外処理 -