JAX-RSをやってみる (16) - ParamConverter -
参考: 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を実装しなくても型変換の仕組みを提供できるっぽい