我正在尝试向媒体类型设置为的 jaxrs 服务执行请求multipart/form-data
。此请求包含实体列表(xml)和图像(png,二进制)。我已经按照BalusC在此线程中的描述创建了请求。
在wireshark中检查后请求似乎没问题,除了ip头校验和错误。(说“可能是由IP校验和卸载引起的”。)
我的大问题是如何在服务端处理多部分请求。我不希望包含来自 apache.cxf、resteasy 或类似的任何库。我只想依赖 jaxrs api。
请求中的两部分具有名称deliveries
和signature
,其中签名是以二进制形式发送的 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 读取多部分请求的不同部分?
编辑
好的,所以我把PUT
toPOST
和添加@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,我无法从中读取任何字节。
我在这里错过了一个要点吗?