RESTeasy と Seam を使用して、いくつかの Web サービスの開発に取り組んでいます。私が作成したいサービスの 1 つは、Query by Example サービスです。
私は最初に次のようにコーディングしようとしました:
@GET
@Produces("application/xml")
@Consumes("application/xml")
@Path("/matching")
public MessageList getMatchingMessages(Message msg);
残念ながら、これはクライアントに複雑さをもたらしました。
[testng] [Parser] Running:
[testng] C:\Users\bdw\workspace-shepherd\GPRI\test-build\testng-Test.xml
[testng] java.lang.RuntimeException: java.lang.ClassCastException: org.apache.commons.httpclient.methods.GetMethod cannot be cast to org.apache.commons.httpclient.methods.EntityEnclosingMethod
[testng] at org.jboss.resteasy.client.core.ClientInvoker.invoke(ClientInvoker.java:104)
[testng] at org.jboss.resteasy.client.core.ClientProxy.invoke(ClientProxy.java:59)
[testng] at $Proxy138.getMatchingMessages(Unknown Source)
等々。この方法のバリエーションでは、日付範囲を使用できますが、明らかに、次の形式でも機能しません。
@GET
@Produces("application/xml")
@Consumes("application/xml")
@Path("/matching")
public MessageList getMatchingMessages(@QueryParam("startDate") Date start,
@QueryParam("endDate") Date end, Message msg);
考えてみると、Message を GET メソッドに渡すことは、REST の精神に違反している可能性があります。確かに、Consumes アノテーションをメソッドから削除すると、クライアントはこれらのエラーなしで実行できます。しかし、ここで疑問が生じます。非 URL ベースの XML 入力を受け取り、XML 出力を生成するクエリ メソッドを作成する正しい方法は何でしょうか? それとも、XML と URL ベースのパラメーターの両方を取り、XML 出力を生成しますか?