将多个xml对象传递给jax-rs服务

时间:2012-10-16 17:45:29

标签: java android jaxb jersey jax-rs

我在我的服务器代码上使用JAX-RS Jersey和JAXB来实现服务,我从Android应用程序中消费。我已经有了以xml格式返回自定义对象的服务,我可以在客户端解组它们。 现在我想将自定义对象从客户端发送到xml中的服务器,我写了一个简单的测试,但它失败了,错误400。 这是服务:

@POST
@Path("/test")
@Produces(MediaType.TEXT_PLAIN)
@Consumes(MediaType.APPLICATION_XML)
public String test(List<Client> clientList, Client client) {
    //do something with clientList and client
    return response;
}

这是我在请求正文中发送的xml:

<clientList>
    <client name="" phone="" address="" />        
    <client name="" phone="" address="" />        
</clientList>
<client name="" phone="" address="" />

这是客户端代码:

HttpPost httpPost = new HttpPost(url);                
httpPost.addHeader("Accept", "text/plain");
httpPost.setHeader("Content-Type", "application/xml");
httpPost.setEntity(new StringEntity(xmlFromAbove, HTTP.UTF_8));
HttpResponse response = androidHttpClient.execute(httpPost);

如果我只在服务中放置一个参数它可以正常工作,但是有多个参数似乎JAXB不知道如何解组它们。 我是否必须在一个自定义对象中包装我需要的所有参数,或者是否有更简单的方法来执行此操作?

我也尝试将xml字符串作为FormParams传递并使用以下代码解组

JAXBContext jc = JAXBContext.newInstance(Client.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();            
List<Client> clients = 
    (List<Client>)unmarshaller.unmarshal(new StringReader(clientListXml));

但它也没有用,它抛出

javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"clients").  
    Expected elements are <{}client>

当我从服务返回List时,jaxb正确编组它,而不必将列表包装在自定义对象中。无论如何我是否必须将其包起来进行解组?

1 个答案:

答案 0 :(得分:4)

  

我是否必须在一个自定义对象中包装我需要的所有参数,

是的,这是一种选择。

  

还是有更简单的方法吗?

不简单,但您也可以使用多部分媒体类型发送包含多个部分的请求实体 - 查看jersey-multipart模块的javadoc以获取更多信息(http://jersey.java.net/nonav/ apidocs /最新/球衣/贡献/ Jersey的多部分/ index.html中)

  

当我从服务返回List时,jaxb正确编组它,而不必将列表包装在自定义对象中。

那是因为泽西为你包裹它。如果您手动解组列表,则必须自己包装。