JAX-RS2.0でRESTサービスを作る際にヘッダーを指定する

RESTサービス作るのを楽にやりたいとおもったらまあJava使わないのですが、
大人の事情でやっぱJavaだよねということはよくあり、そんなときにはJAX-RS (Java API for RESTful Web Services) がめっちゃ便利です。
NetBeansでポチポチーするだけでRestWebサービスは作れます。
RESTサービスとして使うにはクロスドメインでアクセスを許可(CORS)するため「Access-Control-Allow-Origin」ヘッダーをつけましょう。

JAX-RS2.0

JAX-RSというと1.1の頃からの参照実装であるJersey1系が有名ですが、
JavaEE7時代としては大幅な機能追加されているJAX-RS2.0をつかいます。
JavaEE7から標準になったので特に追加なく使えてよい。

ちなみJAX-RS2.0はこんな感じで機能拡充しています
・クライアント側でも非同期処理をサポート
・Bean Validation対応
・プロバイダー機能の拡充
  エンティティー・インターセプターの追加
  フィルター機能の追加

ヘッダーの指定方法

さて、ヘッダの指定方法ですが、ぐぐるとJAXRS1.1系の話ばかり出てきて惑わされますが気にせずいきましょう。
設定の仕方はJAX-RS2.0だと超絶簡単。以下のようなクラスを作ってクラスパスに置くだけ。

import java.io.IOException;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.ext.Provider;

/**
 *
 * @author garapon
 */
@Provider
public class CORSFilter implements ContainerResponseFilter {

    @Override
    public void filter(ContainerRequestContext request,
            ContainerResponseContext response) throws IOException {
        response.getHeaders().add("Access-Control-Allow-Origin", "*");
        response.getHeaders().add("Access-Control-Allow-Headers", "origin, content-type, accept, authorization");
        response.getHeaders().add("Access-Control-Allow-Credentials", "true");
        response.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
    }
}

JAX-RS2.0の新機能のプロバイダーでFilterが設定できるようになったのでマジ便利です。web.xmlとか書かなくていい。