如何在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;作家呢?任何示例代码都很有用。
由于
答案 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。这对我很有用。