How do I get a handle on data being submitted via a REST request so I can safely process part of it using StAX.
I have a class called ProcessHustleRequest which is generated by JAXB. However it currently contains an element called "attachmentBinary" with BinaryData that is too big to load into memory so I wish to drop down into StAX in order to avoid pulling the entire document into memory.
My XML looks like this:
<?xml version="1.0" encoding="utf-8"?> <ProcessRequest> <DeliveryDate>2015-12-13</DeliveryDate> <AttachmentBinary>iVBORw0KGgoAAAANSUhEUgAAAFoA</AttachmentBinary> <AttachmentBinary>iVBORw0KGgoAAAANSUhEUgAAAFoA</AttachmentBinary> </ProcessRequest>
My server side Jersey resource is defined as follows:
@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();
}
I've seen an example here that might be relevant: JAXB - unmarshal OutOfMemory: Java Heap Space
but I don't know how to get a handle on the XML file being sent to me. Presumable if I could, then I should just remove JAXB references to attachmentBinary and just pull in that element only using STaX.
My suspicion is that I might also be able to implement something based on this answer 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
}