Jaxrs multipart

Run*_*lse 10 multipartform-data jax-rs

我正在尝试向媒体类型设置为的jaxrs服务执行请求multipart/form-data.此请求包含实体列表(xml)和图像(png,二进制).我已经创建了BalusC 在主题中描述的请求.

在wireshark中检查它之后,请求似乎没问题,除了ip头校验和错误.(说"可能是由IP校验和卸载引起的".)

这里我的大问题是如何在服务端处理多部分请求.我不希望包含来自apache.cxf,resteasy或任何类型的任何库.我想要依赖的是jaxrs api.

这两部分的要求有名字deliveriessignature,其中签名是发送二进制PNG图像文件.应该从xml解析交付列表(实体具有xmlrootelement注释等,因此这部分单独工作).我尝试用这种方式阅读不同的部分,但这真的是一个长期的结果;

@PUT
@Path("signOff")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public void signOffDeliveries(@FormParam("deliveries") List<Delivery> deliveries, @FormParam("signature")File signature) {
    //do something with the signature(image) and the list of deliveries.
}
Run Code Online (Sandbox Code Playgroud)

这当然不起作用,如果我在Websphere上运行请求,它会给我一个404 http状态代码,当我向嵌入式openejb(在我们的集成测试框架中)运行请求时,它会给我一个415.如果我删除FormParam注释,请求成功.

如何仅使用jaxrs api读取多部分请求的不同部分?

编辑 好了,所以我把它编织PUT到了POST,并@Encoding为params 添加了一个注释:

@POST
@Path("signOff")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public void signOffDeliveries(
    @Encoded @FormParam("deliveries") String deliveries,
    @Encoded @FormParam("signature") File signature) {

}
Run Code Online (Sandbox Code Playgroud)

现在我将xml作为文本字符串,但我无法自动将其解组为交付列表,即使Content-Type有效负载的这部分设置为application/xml.另一个问题是我收到的文件长度== 0,我无法从中读取任何字节.

我在这里错过了一个基本点吗?

Ret*_*mür 8

事实上,我发现很难理解为什么JAX-RS规范没有标准化对此的支持(我刚刚创建了https://java.net/jira/browse/JAX_RS_SPEC-413来解决这个问题).

然而,仍然可以以独立于实现的方式支持多部分表单.您可以为MultiPart表单编写自己的MessageBodyReader,也可以使用像Apache Clerezza jaxrs.utils这样的库,它们提供相应MessageBodyReader的MultiPartBody对象.该库没有实现规范依赖性,因此您的应用程序将在任何jax-rs实现上运行.

有关如何使用Clerezza jaxrs.utils的示例,请参阅http://svn.apache.org/viewvc/stanbol/trunk/development/archetypes/stateless-webmodule/src/main/resources/archetype-resources/src中的第105行./main/java/MultiEnhancer.java?revision=1465777&view=markup.如果您不使用OSGi(使用白板注册资源),则必须将org.apache.clerezza.jaxrs.utils.form.MultiPartFormMessageBodyReader添加到您的应用程序.


yeg*_*256 -2

我不希望包含来自 apache.cxf、resteasy 或类似内容的任何库。我只想依赖 jaxrs api

您不能“依赖”API,因为它只包含接口。实现该接口的类来自 RESTeasy、Jersey 或 CXF。

当我向嵌入式 openejb 运行请求时,返回 415

415 表示“方法不受支持”,当您向 PUT 预期资源发送 GET 请求时会发生这种情况。

在这种情况下,我建议使用 POST 而不是 PUT。我怀疑@FormParam在您的具体情况下,不适合与 PUT 一起使用。

  • 我知道 API 只是接口,但只要我不包含对任何 apache cxf 特定实现的任何引用,我应该能够轻松地更改容器。但是,将方法更改为 POST 没有任何作用。 (8认同)