CXF JAXRS - 如何POST多个参数

时间:2012-03-08 19:29:29

标签: java web-services cxf jax-rs

如何在POST请求中的请求正文中发送多个参数?

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

上面的代码返回HTTP 415。

@FormParam替换@Multipart会导致Resource method has more than one parameter representing a request body错误,如下所示。

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注释来传递这样的参数,但我想这在传递多个参数的情况下不起作用?我是否需要定义自己的消息体阅读器&amp;作家呢?任何示例代码都很有用。

由于

2 个答案:

答案 0 :(得分: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());

答案 1 :(得分:1)

您不会将@FormParam@Consumes一起使用;在参数上只使用@FormParam,CXF会找出其余部分。

当我传回结果时,我返回一个包含事物列表的JAXB注释对象。 CXF内部使用Jettison,它使用这些JAXB注释来指导转换为JSON。这对我很有用。