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);

サービスにパラメーターを 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 はそれを正しくマーシャリングします。カスタム オブジェクトでリストをラップする必要はありません。アンマーシャリングを行うためにとにかくラップする必要がありますか?

4

1 に答える 1

4

必要なすべてのパラメータを 1 つのカスタム オブジェクトにラップする必要がありますか?

はい、それもひとつの選択肢でしょう。

またはそれを行う簡単な方法はありますか?

単純ではありませんが、マルチパート メディア タイプを使用して、複数のパートで構成されるリクエスト エンティティを送信することもできます。詳細については、jersey-multipart モジュールの javadoc を参照してください (http://jersey.java.net/nonav/apidocs/latest) /jersey/contribs/jersey-multipart/index.html)

サービスから List を返すと、jaxb はそれを正しくマーシャリングします。カスタム オブジェクトでリストをラップする必要はありません。

それは、Jersey がラップしてくれるからです。リストを手動で非整列化する場合は、自分でラップする必要があります。

于 2012-10-17T10:21:02.427 に答える