我正在尝试向媒体类型设置为 multipart/form-data
的jaxrs服务执行请求。此请求包含一个实体(xml)列表和一张图像(png,二进制)。我按照BalusC在这个线程中描述的方式创建了请求。
检查wireshark后,请求似乎没问题,除了ip头校验和不正确(说的是“可能是由IP校验和卸载导致的”)。
我的主要问题在于如何在服务端处理多部分请求。我不希望包括来自apache.cxf、resteasy或任何其他库的任何内容。我只想依赖于jaxrs API。
请求中的两个部分名称分别为deliveries
和signature
,其中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
更改为POST
,并向参数添加了@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,我无法从中读取任何字节。
我是否遗漏了一个重要的点?