11

如何转换HttpServletRequestString?我需要解组,HttpServletRequest但是当我尝试解组时,我的程序会引发异常。

 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)

我尝试了以下代码来解组HttpServletRequest​​ .

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

我的解析器方法:

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

2 回答 2

7

我的印象是,在您处理了请求并响应您的客户之后,您正试图从输入流中读取数据。你把你的代码放在哪里了?

如果要先处理请求,然后再进行解组,则需要先将输入流读入字符串。如果您处理的是小请求,这很好用。

我建议使用像 apache commons IOUtils 这样的东西来为你做这件事。

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

另请记住,您必须在 和 之间进行request.getParameter(name)选择request.getInputStream。你不能同时使用两者。

于 2012-09-04T09:39:15.310 回答
3
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();
}
于 2016-04-29T13:40:41.270 回答