JAX-RSをやってみる (7) - Reader & Writer interceptor -
公式ドキュメント先: 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は発動しない模様