如何处理通过REST请求提交的数据,以便我可以使用StAX安全地处理部分数据。
我有一个名为ProcessHustleRequest的类,它由JAXB生成。但是它目前包含一个名为" attachmentBinary" BinaryData太大而无法加载到内存中,所以我希望下载到StAX中以避免将整个文档拉入内存。
我的XML看起来像这样:
<?xml version="1.0" encoding="utf-8"?> <ProcessRequest> <DeliveryDate>2015-12-13</DeliveryDate> <AttachmentBinary>iVBORw0KGgoAAAANSUhEUgAAAFoA</AttachmentBinary> <AttachmentBinary>iVBORw0KGgoAAAANSUhEUgAAAFoA</AttachmentBinary> </ProcessRequest>
我的服务器端Jersey资源定义如下:
@POST
@Path("/hustle")
@Consumes(MediaType.TEXT_XML)
@Produces(MediaType.TEXT_XML)
public Response consumeXMLtoHustle(ProcessHustleRequest processHustle) {
// I currently pull in attachmentBinary as a String or some other object and //run out of memory.
try {
String tempImage = "E:\\temp\\attachment.bin";
Base64.decodeToFile(processHustle.getAttachmentBinary(), tempImage);
processTicket.setHasImage(true);
processTicket.setImageFileName(tempImage);
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
return Response.ok().entity(processHustleResponse).build();
}
我在这里看到了一个可能相关的示例:JAXB - unmarshal OutOfMemory: Java Heap Space
但我不知道如何处理发送给我的XML文件。如果可以,可以推测,那么我应该只删除对attachmentBinary的JAXB引用,只使用STaX引入该元素。
我怀疑我也可以根据这个答案实施一些事情How to avoid OutOfMemoryError when uploading a large file using Jersey client
@POST
@Path("/hustle/{attachmentName}")
@Consumes(MediaType.APPLICATION_OCTET_STREAM)
public void uploadAttachment(@PathParam("attachmentName") String attachmentName, InputStream attachmentInputStream) {
// do something with the input stream
}