2012-09-05 90 views
1

我从客户端获取HttpservletRequest,我试图解析请求(使用JAXB,DOM)。对于我使用下面的代码InputStream异常解析

String str_request = IOUtils.toString(request.getInputStream()); 
System.out.println("String is " + str_request); 
requestStream = new ByteArrayInputStream(str_request.getBytes()); 

我的问题是,当我的requestStream传递给我的解析器方法,一种方法是工作正常,但另一种失败。我猜这是inputStream的问题,但我无法解决这个问题。任何人都可以为这个问题提出解决方案。

DOM解析器方法:

public String parseMethodName(InputStream request) throws SAXException, 
                  IOException, 
                  ParserConfigurationException { 

    System.out.println("in parseMethodName"); 
    DocumentBuilderFactory dbFactory = 
     DocumentBuilderFactory.newInstance(); 
    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
    System.out.println("bfor parse"); 
    Document doc = dBuilder.parse(request); 
    System.out.println("After parse"); 
    methodName = 
      doc.getElementsByTagName("methodName").item(0).getTextContent(); 
} 

JAXB解析器方法:

System.out.println("in parse ******"); 
JAXBContext context = JAXBContext.newInstance(MethodCall.class); 
System.out.println("bfor unmarshall ****"); 
Unmarshaller um = context.createUnmarshaller(); 
System.out.println("After unmarshall ****"); 
mc = (MethodCall) um.unmarshal(is); 

我收到以下异常:

javax.xml.bind.UnmarshalException 
- with linked exception: 
[org.xml.sax.SAXParseException: Premature end of file.] 
     at javax.xml.bind.helpers.AbstractUnmarshallerImpl.createUnmarshalException(AbstractUnmarshallerImpl.java:315) 
     at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.createUnmarshalException(UnmarshallerImpl.java:481) 
     at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:199) 
     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) 

回答

3

你不应该输入流转换为一个字符串,然后返回到一个字节数组。这只是要求丢失数据,尤其是在将字符串转换为字节数组时使用平台默认编码。

看看无论你正在使用IOUtils类包含一个方法只是完全读取InputStreambyte[],并使用该为您ByteArrayInputStream的基础。

请注意,如果要多次读取数据,您需要重置流,或者在同一个字节数组周围创建新流。