JAX-RSでコンテキストの取得

2 min read読了の目安(約2100字

JAX-RSのリソースクラスのメソッドの中で実行環境に関する情報(コンテキスト)を取得できる。何が取得できるかとはJSR-339のSection-9.2に記述してあるもの(Application・UriInfo・HttpHeaders・Requestなど)とサーブレットの場合は10.1に上げられているもの(ServletConfig・ServletContextなど)が取得できる。ただしJAX-RSを使っているときにサーブレットコンテキストに頼るような構成はあまりやらないほうが良いらしい。

具体的な情報は@Contextアノテーションを使って取得する。以下サンプルとテスト。

package example.jaxrs;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.UriInfo;

@Path("/")
public class ContextResource {

    @GET
    @Path("uriinfo")
    public String uriinfo(@Context UriInfo uriInfo) {
        return uriInfo.getPath() + ";" + uriInfo.getQueryParameters().getFirst("foo");
    }

    @GET
    @Path("headers")
    public String headers(@Context HttpHeaders headers) {
        return headers.getHeaderString("X-Qiita-Demo");
    }
}

この例ではUriInfoを通してURIのパスとGETのパラメータを取得する例とHttpHeadersを通してHTTPのヘッダを取得する例を作成した。以下はテストコード。

package example.jaxrs

import org.glassfish.jersey.server.ResourceConfig
import org.glassfish.jersey.test.JerseyTest
import spock.lang.Shared
import spock.lang.Specification

import javax.ws.rs.core.Application

class ContextResourceTest extends Specification {
    @Shared
    def jerseyTest = new JerseyTest() {
        @Override
        protected Application configure() {
            return new ResourceConfig(ContextResource.class)
        }
    }

    def setupSpec() {
        jerseyTest.setUp()
    }

    def cleanupSpec() {
        jerseyTest.tearDown()
    }


    def "test uriinfo"() {
        when:
        def response = jerseyTest.target("/uriinfo").queryParam("foo", "bar").request().get()

        then:
        response.readEntity(String.class) == "uriinfo;bar"
    }

    def "test headers"() {
        when:
        def response = jerseyTest.target("/headers").request().header("X-Qiita-Demo", "Foo Bar").get()

        then:
        response.readEntity(String.class) == "Foo Bar"
    }
}

参考