2009-11-30 4 views
0

J'ai un simple petit servlet, essentiellement:JAXB, obtenir le xml d'origine après unmarshalling

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

Est-il possible que je peux mettre la main sur l'ici XML d'origine, si l'analyse syntaxique échoue - la plupart du temps à des fins de traçage . Ou devrais-je juste enregistrer dans un fichier et unmarshal de cela?

Répondre

1

Vous pouvez lire le request.getInputStream() dans un String, et unmarshal que String, en appelant um.unmarshall(new StringReader(str)); Alors que String sera également accessible dans les prises article

+0

s'il vous plaît ne lisent pas dans une chaîne. Si vous devez le lire en mémoire, utilisez un octet []. – james

3

Si vous voulez faire cela, vous aurez besoin de lire la demande InputStream dans un tampon temporaire (par exemple une chaîne ou un octet []), puis passer cela à travers JAXB. Si vos documents sont volumineux, cela pourrait nuire à votre performance, mais si vos documents sont volumineux, alors JAXB sera lent de toute façon.

Si vous avez le bon sens d'utiliser Apache Commons IO, alors c'est facile:

String buffer = IOUtils.toString(request.getReader()); 
Object obj = jaxbContext.createUnmarshaller().unmarshal(new StringReader(buffer)); 
// do something else with the buffer here 
+0

s'il a du bon sens, il devrait utiliser un octet [] pas une chaîne. moins de chance de casser les données xml. – james

Questions connexes