我在我的服务器代码上使用 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 会正确编组它,而不必将列表包装在自定义对象中。为了进行解组,我是否必须将其包装起来?