2

我在我的服务器代码上使用 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>

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

4

1 回答 1

4

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

是的,那将是一种选择。

或者有更简单的方法吗?

不是更简单,但您也可以使用多部分媒体类型发送由多个部分组成的请求实体 - 查看 jersey-multipart 模块的 javadoc 以获取更多信息(http://jersey.java.net/nonav/apidocs/latest /jersey/contribs/jersey-multipart/index.html)

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

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

于 2012-10-17T10:21:02.427 回答