サーバー コードで 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);
サービスにパラメーターを 1 つだけ配置すると正常に動作しますが、複数のパラメーターを使用すると、JAXB はそれらを非整列化する方法を認識していないようです。必要なすべてのパラメータを 1 つのカスタム オブジェクトにラップする必要がありますか?それとももっと簡単な方法はありますか?
また、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 はそれを正しくマーシャリングします。カスタム オブジェクトでリストをラップする必要はありません。アンマーシャリングを行うためにとにかくラップする必要がありますか?