我正在使用 RESTeasy 和 Seam 开发一些 Web 服务。我想创建的服务之一是 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 输出?