1

クライアントからHttpservletRequestを取得していますが、リクエストを解析しようとしています(JAXB、DOMを使用)。そのために私は次のコードを使用しています

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

私の問題は、requestStreamをパーサーメソッドに渡すと、1つのメソッドは正常に機能していますが、別のメソッドは失敗することです。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)
4

1 に答える 1

3

入力ストリームを文字列に変換してからバイト配列に戻すべきではありません。これは、特に文字列をバイト配列に変換するときにプラットフォームのデフォルトエンコーディングを使用する場合に、データを失うことを要求しているだけです。

IOUtils使用しているクラスに、を完全に読み取るメソッドが含まれているInputStreamかどうかを確認し、それをの基礎としてbyte[]使用します。ByteArrayInputStream

データを複数回読み取りたい場合は、ストリームをリセットするか、同じバイト配列の周りに新しいストリームを作成する必要があることに注意してください。

于 2012-09-05T09:15:45.180 に答える