jaxb, получить исходный xml после распаковки

У меня есть простой маленький сервлет, в основном:

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;
    }
...

Есть ли способ получить исходный XML здесь, если синтаксический анализ не удался - в основном для целей отслеживания. Или я должен просто сохранить в файл и удалить из него?


person Anonym    schedule 30.11.2009    source источник


Ответы (2)


Вы можете прочитать request.getInputStream() в String и разобрать этот String, вызвав um.unmarshall(new StringReader(str)); Тогда этот String также будет доступен в предложении catch

person Bozho    schedule 30.11.2009
comment
пожалуйста, не читайте это в строку. если вы должны прочитать его в память, используйте byte[]. - person james; 30.11.2009

Если вы хотите это сделать, вам нужно прочитать запрос InputStream во временный буфер (например, строку или байт []), а затем передать его через JAXB. Если ваши документы большие, это может снизить вашу производительность, но тогда, если ваши документы большие, JAXB все равно будет медленным.

Если у вас есть здравый смысл использовать Apache Commons IO, то это легко сделать:

String buffer = IOUtils.toString(request.getReader());
Object obj = jaxbContext.createUnmarshaller().unmarshal(new StringReader(buffer));
// do something else with the buffer here
person skaffman    schedule 30.11.2009
comment
если у него есть здравый смысл, он должен использовать byte[], а не строку. меньше шансов сломать данные xml. - person james; 30.11.2009