Como converter um HttpServletRequest para String?

Como posso converter um HttpServletRequest para String ? Eu preciso desmarcar o HttpServletRequest mas quando eu tento, meu programa lança uma exceção.

  javax.xml.bind.UnmarshalException - with linked exception: [java.io.IOException: Stream closed] at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:197) at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:168) at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:137) at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:184) at com.orange.oapi.parser.XmlParsing.parse(XmlParsing.java:33) 

Eu tentei o código a seguir para desmarcar o HttpServletRequest .

 InputStreamReader is = new InputStreamReader(request.getInputStream()); InputStream isr = request.getInputStream(); ServletInputStream req = request.getInputStream(); 

Meu método analisador:

 public root parse(InputStreamReader is) throws Exception { root mc = null; try { JAXBContext context = JAXBContext.newInstance(root.class); Unmarshaller um = context.createUnmarshaller(); mc = (root) um.unmarshal(is); } catch (JAXBException je) { je.printStackTrace(); } return mc; } 

Tenho a impressão de que você está tentando ler o stream de input depois de lidar com a solicitação e responder ao seu cliente. Onde você colocou seu código?

Se você quiser manipular o pedido primeiro, e fazer o unmarshalling mais tarde, você precisa ler o inputstream em um String primeiro. Isso funciona bem se são pequenos pedidos que você está lidando.

Eu sugiro usar algo como apache commons IOUtils para fazer isso por você.

 String marshalledXml = org.apache.commons.io.IOUtils.toString(request.getInputStream()); 

Também tenha em mente que você tem que escolher entre request.getParameter(name) e request.getInputStream . Você não pode usar os dois.

 String httpServletRequestToString(HttpServletRequest request) throws Exception { ServletInputStream mServletInputStream = request.getInputStream(); byte[] httpInData = new byte[request.getContentLength()]; int retVal = -1; StringBuilder stringBuilder = new StringBuilder(); while ((retVal = mServletInputStream.read(httpInData)) != -1) { for (int i = 0; i < retVal; i++) { stringBuilder.append(Character.toString((char) httpInData[i])); } } return stringBuilder.toString(); }