2012-03-08 95 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); 

以上代碼返回HTTP 415

@Multipart導致Resource method has more than one parameter representing a request body誤差更換@FormParam,如下所示。

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

不要使用@FormParam@Consumes;在參數上只使用@FormParam,CXF將找出其餘的。

當我傳回結果時,返回包含事物列表的單個JAXB註釋的對象。 CXF內部使用Jettison,它使用這些JAXB註釋來指導轉換爲JSON。這對我來說很好。

+1

刪除'@ Consumes'幫助。然而,我意識到我需要通過'@ Multipart' params,因爲我的參數並不簡單。我需要POST 2這些類型的參數:1. List >和2. MyCustomObject。傳遞1個這樣的參數可以正常工作(我爲'Map 定義了'XmlJavaTypeAdapter',並且用'@ XmlRootElement'註釋了'MyCustomObject')。但是,當我傳遞兩個參數時,它會拋出'具有多個參數來表示請求體'錯誤。我爲'@ Consumes'嘗試'multipart/mixed'&'multipart/related',並用'@ Multipart'標記了參數。感謝快速幫助。 – domino 2012-03-09 08:04:39

+0

@domino嗯,你正在外面的地方,我知道足夠直接建議。 http://cxf.apache.org/docs/jax-rs-multiparts.html表示使用'@ Multipart'或者'List '的簽名。你使用什麼版本的CXF? – 2012-03-09 09:21:59

+0

因爲我沒有處理任何文件/附件,所以我嘗試了'@ Multipart'。將檢查'列表'可以有任何幫助。我使用2.5.2。在那裏**有**例子,似乎表明它應該直接使用'@ Multipart'來POST多個參數。我想我錯過了一些東西。 – domino 2012-03-09 09:42:55

3

我想出了一個辦法來做到這一點(見下面的代碼)。但是,如果您知道更好的方法,那麼最好不要使用「附件」的概念,而直接使用jaxrs:client而不是WebClient,請讓我知道。

服務:

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

客戶:

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

我可以在配置中使用Multipart嗎?由於某種原因,我的服務接口和實現類無法使用Jax-rs/Cxf註釋,所以我想以配置方式發佈服務。但是我發現服務模型資源模式文件jaxrs-common.xsd不支持Multipart Param,並且文檔沒有提到,無論是在這個網頁http://cxf.apache.org/docs/jax-rs-multiparts.html,有沒有什麼辦法可以在配置中使用它?非常感謝! – Allen 2015-06-15 06:19:35

相關問題