15.9. 文字列ベースの注釈
15.9.1. 文字列ベースの @*Param アノテーションをオブジェクトに変換する
@QueryParam、@MatrixParam、@HeaderParam、@PathParam、@FormParam を含む JAX-RS
@*Param
アノテーションは、raw HTTP リクエストで文字列として表されます。これらのタイプのインジェクトされたパラメーターは、それらのオブジェクトに valueOf(String) 静的メソッドまたは String パラメーターを取るコンストラクターがある場合に、オブジェクトに変換できます。
RESTEasy は 2 つの独自仕様を提供します
@Provider
どちらも持たないクラスのこの変換を処理するためのインターフェイスvalueOf(String)
静的メソッド、または文字列コンストラクタ。
例15.14 StringConverter
StringConverter インターフェイスは、カスタム文字列マーシャリングを提供するために実装されています。これは、web.xml ファイルの resteasy.providerscontext-param に登録されています。ResteasyProviderFactory.addStringConverter () メソッドを呼び出して手動で登録することもできます。
以下の例は、StringConverter を使用する簡単な例です。
import org.jboss.resteasy.client.ProxyFactory; import org.jboss.resteasy.spi.StringConverter; import org.jboss.resteasy.test.BaseResourceTest; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import javax.ws.rs.HeaderParam; import javax.ws.rs.MatrixParam; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.QueryParam; import javax.ws.rs.ext.Provider; public class StringConverterTest extends BaseResourceTest { public static class POJO { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } @Provider public static class POJOConverter implements StringConverter<POJO> { public POJO fromString(String str) { System.out.println("FROM STRNG: " + str); POJO pojo = new POJO(); pojo.setName(str); return pojo; } public String toString(POJO value) { return value.getName(); } } @Path("/") public static class MyResource { @Path("{pojo}") @PUT public void put(@QueryParam("pojo")POJO q, @PathParam("pojo")POJO pp, @MatrixParam("pojo")POJO mp, @HeaderParam("pojo")POJO hp) { Assert.assertEquals(q.getName(), "pojo"); Assert.assertEquals(pp.getName(), "pojo"); Assert.assertEquals(mp.getName(), "pojo"); Assert.assertEquals(hp.getName(), "pojo"); } } @Before public void setUp() throws Exception { dispatcher.getProviderFactory().addStringConverter(POJOConverter.class); dispatcher.getRegistry().addPerRequestResource(MyResource.class); } @Path("/") public static interface MyClient { @Path("{pojo}") @PUT void put(@QueryParam("pojo")POJO q, @PathParam("pojo")POJO pp, @MatrixParam("pojo")POJO mp, @HeaderParam("pojo")POJO hp); } @Test public void testIt() throws Exception { MyClient client = ProxyFactory.create(MyClient.class, "http://localhost:8081"); POJO pojo = new POJO(); pojo.setName("pojo"); client.put(pojo, pojo, pojo, pojo); } }
例15.15 StringParameterUnmarshaller
The
StringParameterUnmarshaller
インターフェイスは、挿入するパラメーターまたはフィールドに配置された注釈に敏感です。インジェクターごとに作成されます。setAnnotations () メソッドは、アンマーシャラーを初期化するために resteasy によって呼び出されます。
このインターフェイスは、インターフェイスを実装するプロバイダーを作成して登録することで追加できます。と呼ばれるメタアノテーションを使用してバインドすることもできます
org.jboss.resteasy.annotations.StringsParameterUnmarshallerBinder
。
以下の例では、
java.util.Date
ベースの @PathParam。
public class StringParamUnmarshallerTest extends BaseResourceTest { @Retention(RetentionPolicy.RUNTIME) @StringParameterUnmarshallerBinder(DateFormatter.class) public @interface DateFormat { String value(); } public static class DateFormatter implements StringParameterUnmarshaller<Date> { private SimpleDateFormat formatter; public void setAnnotations(Annotation[] annotations) { DateFormat format = FindAnnotation.findAnnotation(annotations, DateFormat.class); formatter = new SimpleDateFormat(format.value()); } public Date fromString(String str) { try { return formatter.parse(str); } catch (ParseException e) { throw new RuntimeException(e); } } } @Path("/datetest") public static class Service { @GET @Produces("text/plain") @Path("/{date}") public String get(@PathParam("date") @DateFormat("MM-dd-yyyy") Date date) { System.out.println(date); Calendar c = Calendar.getInstance(); c.setTime(date); Assert.assertEquals(3, c.get(Calendar.MONTH)); Assert.assertEquals(23, c.get(Calendar.DAY_OF_MONTH)); Assert.assertEquals(1977, c.get(Calendar.YEAR)); return date.toString(); } } @BeforeClass public static void setup() throws Exception { addPerRequestResource(Service.class); } @Test public void testMe() throws Exception { ClientRequest request = new ClientRequest(generateURL("/datetest/04-23-1977")); System.out.println(request.getTarget(String.class)); } }
@DateFormat と呼ばれる新しいアノテーションを定義します。アノテーションは、DateFormater クラスへの参照を含むメタアノテーション StringParameterUnmarshallerBinder でアノテーションが付けられます。
Service.get () メソッドには @PathParam パラメーターがあり、これにも @DateFormat アノテーションが付けられています。@DateFormat を適用すると、DateFormatter のバインドがトリガーされます。これで、DateFormatter が実行され、パスパラメーターが get () メソッドの日付パラメーターにアンマーシャリングされます。