【问题标题】:CXF JAXRS - How to POST more than one parameterCXF JAXRS - 如何发布多个参数
【发布时间】:2012-03-08 19:29:29
【问题描述】:

如何在 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 对其进行注释来传递此类参数,但我想在传递多个参数的情况下这不起作用?我是否需要定义自己的消息正文阅读器和作者?任何示例代码都会很有用。

谢谢

【问题讨论】:

    标签: java web-services cxf jax-rs


    【解决方案1】:

    我想出了一个方法来做到这一点(见下面的代码)。但是如果你知道更好的方法,最好不要使用“附件”的概念,直接使用 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());
    

    【讨论】:

    • 我可以在配置中使用 Multipart 吗?由于某种原因,我的服务接口和实现类无法使用 Jax-rs/Cxf 注释,所以我想以配置方式发布服务。但我发现服务模型资源架构文件 jaxrs-common.xsd 不支持 Multipart Param 并且文档不支持在这个页面cxf.apache.org/docs/jax-rs-multiparts.html上提到过,请问有什么方法可以在config中使用吗?非常感谢!
    【解决方案2】:

    您不要将@FormParam@Consumes 一起使用;只需在参数上使用@FormParam,CXF 会计算出其余的。

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

    【讨论】:

    • 删除 @Consumes 有帮助。但是,我意识到我需要传递 @Multipart 参数,因为我的参数并不简单。我需要发布这些类型的 2 个参数:1.List&lt;Map&lt;String, String&gt;&gt; 和 2.MyCustomObject。传递 1 个这样的参数可以正常工作(我为 Map&lt;String, String&gt; 定义了 XmlJavaTypeAdapter 并用 @XmlRootElement 注释了 MyCustomObject)。但是当我通过两个参数时,它会抛出has more than one parameter representing a request body 错误。我为@Consumes 尝试了multipart/mixedmultipart/related,并用@Multipart 标记了参数。感谢快速帮助。
    • @domino 嗯,你已经超出了我非常熟悉的领域,可以直接提供建议。 cxf.apache.org/docs/jax-rs-multiparts.html 表示使用@Multipart List&lt;Attachment&gt; 的签名。您使用的是哪个版本的 CXF?
    • 因为我不处理任何文件/附件,所以我尝试了@Multipart。将检查List&lt;Attachment&gt; 是否有任何帮助。我正在使用 2.5.2。该页面上有 示例,这些示例似乎表明应该直接使用@Multipart 发布多个参数。我想我错过了什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多