Question

I've a simple little servlet, basically:

void doPost(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException {
    JAXBContext jaxb = myContext.getXMLContext().getSearchparamContext();
    SearchParams params = null;
     try {
        Unmarshaller um = jaxb.createUnmarshaller();
        um.setSchema(myContext.getXMLContext().getSearchParamsSchema()); 
         JAXBElement<SearchParams> je = (JAXBElement<SearchParams>) um.unmarshal(request.getInputStream());
        params = je.getValue();
    } catch (JAXBException e) {
        logger.log(Level.WARNING,"Error parsing xml from user "+ request.getRemoteUser(),e);
        response.sendError(HttpServletResponse.SC_BAD_REQUEST);
        return;
    }
...

Is there any way I can get hold of the original XML here, if parsing fails - mostly for tracing purposes. Or should I just save to a file and unmarshal from that ?

Was it helpful?

Solution

You can read the request.getInputStream() into a String, and unmarshal that String, by calling um.unmarshall(new StringReader(str)); Then that String will also be accessible in the catch-clause

OTHER TIPS

If you want to do that, you'll need to read the request InputStream into a temporary buffer (e.g. a String or a byte[]), and then pass that through JAXB. If your documents are large, then this could hurt your performance, but then if your documents are large, then JAXB is going to be slow anyway.

If you have the good sense to use Apache Commons IO, then this is easy:

String buffer = IOUtils.toString(request.getReader());
Object obj = jaxbContext.createUnmarshaller().unmarshal(new StringReader(buffer));
// do something else with the buffer here
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top