2012-03-08 191 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

相关问题