JAX-RSをやってみる (16) - ParamConverter -

2014-08-16T00:00:00+00:00 Java JAX-RS

参考: http://backpaper0.github.io/2013/07/17/jaxrs_parameter.html

「JAX-RSをやってみる (1)」にも書いてるけど、引数等の型変換の仕組みはfromStringもしくはvalueOfメソッドを定義する事でも可能なのだけどParamConverterっていう仕組みもあるっぽい。という事で使ってみた

Home.java

package sample.controller;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;

import sample.bean.SampleBean;

@Path("/sample")
public class Home {
    @GET
    public String index(@QueryParam("name") SampleBean bean) {
        return bean.getName();
    }
}

な感じに引数って独自のオブジェクトを指定していて、@QueryParam("name")で参照される値からオブジェクトへの型変換を行うような感じで

package sample.controller;

import javax.ws.rs.core.Application;

import org.glassfish.jersey.test.JerseyTest;
import org.glassfish.jersey.test.TestProperties;
import org.junit.Test;

import sample.SampleApplication;

import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;

public class HomeTest extends JerseyTest {

    @Override
    protected Application configure() {
        enable(TestProperties.LOG_TRAFFIC);
        enable(TestProperties.DUMP_ENTITY);

        return new SampleApplication();
    }

    @Test
    public void test_index() throws Exception {
        String response = target("/sample")
            .queryParam("name", "hoge")
            .request()
            .get(String.class);

        assertThat(response, is("hoge"));
    }
}

っていうテストが動くように

SampleBeanParamConverterProvider

package sample;

import java.lang.annotation.Annotation;

@Provider
public class SampleBeanParamConverterProvider implements ParamConverterProvider {
    @SuppressWarnings("unchecked")
    @Override
    public <T> ParamConverter<T> getConverter(Class<T> rawType, Type genericType, Annotation[] annotations) {
        if (rawType != SampleBean.class) {
            return null;
        }

        return (ParamConverter<T>)new SampleBeanParamConverter();
    }
}

SampleBeanParamConverter.java

package sample;

import javax.ws.rs.ext.ParamConverter;

import sample.bean.SampleBean;

public class SampleBeanParamConverter implements ParamConverter<SampleBean> {

    @Override
    public SampleBean fromString(String value) {
        SampleBean bean = new SampleBean();
        bean.setName(value);

        return bean;
    }

    // どういう場合に呼ばれるのかが不明
    @Override
    public String toString(SampleBean value) {
        return null;
    }
}

っていう感じで型変換するオブジェクトそのものにfromStringやvalueOfを実装しなくても型変換の仕組みを提供できるっぽい

ActiveRecordのpolymorphic