10

我正在尝试向媒体类型设置为的 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.
}

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

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

编辑 好的,所以我把PUTtoPOST和添加@Encoding注释到参数中,如下所示:

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

}

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

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

4

3 回答 3

8

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

然而,仍然可以以独立于实现的方式支持多部分形式。要么为 MultiPart 表单编写自己的 MessageBodyReader,要么使用像 Apache Clerezza jaxrs.utils 这样的库,它提供了一个 MultiPartBody 对象,对应的 MessageBodyReader。该库没有实现规范依赖,因此您的应用程序将在任何 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 添加到您的应用程序中。

于 2013-06-06T08:46:38.423 回答
1

我已经在 Glassfish 4 中实现了这一点,而没有与 Jersey 耦合。@详情见此贴

于 2013-12-09T17:56:30.603 回答
-2

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

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

当我向嵌入式 openejb 运行请求时出现 415

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

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

于 2013-01-28T15:21:30.413 回答