2012-03-08 20 views
5

POSTリクエストでリクエストボディに複数のパラメータを送信するにはどうすればよいですか?コード上CXF JAXRS - 複数のパラメータをPOSTする方法

@POST 
@Consumes("multipart/form-data") 
@Produces("application/json") 
public String addForm1(@FormParam("i1") Integer i1, @FormParam("i2") Integer i2); 

以下に示すように、Resource method has more than one parameter representing a request bodyエラーで@Multipart結果と@FormParamの交換HTTP 415

を返します。

SEVERE: Resource method service.rs.TestService.postData2 has more than one parameter representing a request body 
Exception in thread "main" org.apache.cxf.jaxrs.client.ClientWebApplicationException: Resource method service.rs.TestService.postData2 has more than one parameter representing a request body 
at org.apache.cxf.jaxrs.client.ClientProxyImpl.reportInvalidResourceMethod(ClientProxyImpl.java:546) 
at org.apache.cxf.jaxrs.client.ClientProxyImpl.getParametersInfo(ClientProxyImpl.java:214) 
at org.apache.cxf.jaxrs.client.ClientProxyImpl.invoke(ClientProxyImpl.java:138) 
at $Proxy20.postData2(Unknown Source) 
at service.TestServiceClient.main(TestServiceClient.java:82) 

また、私はそのようなPOSTメソッドでList<Map<String, String>>' or 'List<MyNestedCustomObject>など、複数の複合型を渡すために何をすべきかが必要ですか?私はJAXBを使ってそのようなパラメータを渡すことができますし、@XmlJavaTypeAdapterでそれを注釈しますが、私は複数のパラメータを渡す場合にはうまくいかないと思いますか?私自身のメッセージ本文読者&作家を定義する必要がありますか?どんなサンプルコードでも便利です。

おかげ

答えて

1

あなたは@Consumes@FormParamを使用しないでください。パラメータには@FormParamだけを使用し、残りの部分はCXFで把握します。

結果を渡すと、物のリストを含む1つのJAXBアノテーション付きオブジェクトが返されます。 CXFは内部的にJettisonを使用しています。これらのJAXB注釈を使用してJSONへの変換が導かれます。これは私にとってかなりうまくいく。

+1

。しかし、私のパラメータは単純ではないので、 '@ Multipart'パラメータを渡す必要があることを知りました。これらの型の2つのパラメータをPOSTする必要があります:1. List >および2. MyCustomObject'。そのような1つのパラメータを渡すとうまくいきます( 'Map 'に 'XmlJavaTypeAdapter'を定義し、' @ XmlRootElement'で 'MyCustomObject'を注釈しました)。しかし、私は両方のパラメータを渡すと、 '要求ボディ'エラーを表す複数のパラメータを持っています。私は '@ Consumes'に' multipart/mixed'と 'multipart/related'を試し、' @ Multipart'でマークしたパラメータを試しました。クイックヘルプを感謝します。 – domino

+0

@dominoうーん、あなたは私が直接アドバイスするのに十分よく知っているエリアの外に出ている。 http://cxf.apache.org/docs/jax-rs-multiparts.htmlは '@ Multipart' _or_を使用して' List 'の署名を使用するように言います。どのバージョンのCXFを使用していますか? –

+0

私はファイル/添付ファイルを扱っていないので、 '@ Multipart'を試しました。 'List 'が助けになるかどうかチェックします。私は2.5.2を使用しています。 **このページには、 '@ Multipart'を使用して複数のパラメータをPOSTするのが簡単であることが示唆されている**例が**あります。私は何かが足りないと思う。 – domino

3

私はこれを行う方法を考え出しました(下記のコードを参照)。しかし、好ましくは「添付ファイル」の概念を使用せず、WebClientの代わりにjaxrs:clientを直接使用する方がよい場合は、教えてください。

サービス:

@POST 
@Path("/postdata3") 
@Consumes("multipart/mixed") 
@Produces("application/json") 
public String postData3(@Multipart(value = "testItem1", type = "application/json") TestItem t1, 
    @Multipart(value = "testItem2", type = "application/json") TestItem t2 
    ); 

クライアント:Consumes`が助け@ `削除

WebClient client = WebClient.create("http://myserver/services/test/postdata3"); 
    client.type("multipart/mixed").accept("application/json"); 
    List<Attachment> atts = new LinkedList<Attachment>(); 
    atts.add(new Attachment("testItem1", "application/json", t1)); 
    atts.add(new Attachment("testItem2", "application/json", t2)); 
    javax.ws.rs.core.Response s = client.postCollection(atts, Attachment.class); 
    System.out.println(s.getStatus()); 
+0

設定でマルチパートを使用できますか?何らかの理由で私のサービスインターフェイスと実装クラスはJax-rs/Cxfアノテーションを使用できませんでしたので、コンフィグレーション方法でサービスを公開したいと思います。しかし、サービスモデルリソーススキーマファイルjaxrs-common.xsdはMultipart Paramをサポートせず、このページhttp://cxf.apache.org/docs/jax-rs-multiparts.htmlのいずれかで、設定で使用する方法はありますか?ありがとうございました! – Allen

関連する問題