6

閉じたストリームを読んだという事実に関連する IOException を回避する方法を見つけようとしています。

Stream を返す Web サービス メソッドを呼び出しています。

      InputStream stream = callRestWebService();
     try {
         parkingState = objectMapper.readValue(stream, ParkingState.class);
      }   catch (IOException e) {
        throw new ParkingMeasurementProviderException("Could not retrieve data.", e);
      } 

次に、get 接続を閉じる Web サービス メソッドがあります。

public InputStream callRestWebService() {
    int parkingId = 2803;
    String endpointURL = REST_ENDPOINT + URI_INFO_PATH + parkingId + "/parkingState";
    InputStream inputStream = null;

    // Create an instance of HttpClient.
    HttpClient httpclient = new HttpClient();

    // Create a method instance.
    GetMethod getMethod = new GetMethod(endpointURL);
    getMethod.addRequestHeader("accept", "application/json");

    try {
        // Execute the method.
        int statusCode = httpclient.executeMethod(getMethod);
        inputStream = getMethod.getResponseBodyAsStream();

     } catch (IOException e) {
       e.printStackTrace();
    } finally {
        // Release the connection.
        getMethod.releaseConnection();
    }
    return inputStream;
}

を削除せずにこの例外を回避する方法はありますか:getMethod.releaseConnection();

スタック トレース:

    Disconnected from the target VM, address: '127.0.0.1:62152', transport: 'socket'
    at be.ixor.itg.server.service.parking.hermesWS.HermesWSParkingControllerMeasurementProvider.getHermesMechelenData(HermesWSParkingControllerMeasurementProvider.java:126)
    at be.ixor.itg.server.service.parking.hermesWS.Main.main(Main.java:14)
Caused by: java.io.IOException: Attempted read on closed stream.
    at org.apache.commons.httpclient.AutoCloseInputStream.isReadAllowed(AutoCloseInputStream.java:183)
    at org.apache.commons.httpclient.AutoCloseInputStream.read(AutoCloseInputStream.java:86)
    at com.sun.org.apache.xerces.internal.impl.XMLEntityManager$RewindableInputStream.read(XMLEntityManager.java:2977)
    at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:702)
    at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:186)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:772)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:232)
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:284)
    at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:124)
    at be.ixor.itg.server.service.parking.hermesWS.HermesWSParkingControllerMeasurementProvider.getHermesMechelenData(HermesWSParkingControllerMeasurementProvider.java:116)
    ... 1 more
4

2 に答える 2

6

finally ブロックで releaseConnection() を呼び出しているため、入力ストリームは使用できなくなります。

コンテンツが大きくないと予想される場合は、入力ストリームからデータをバッファーに読み取り、入力ストリームの代わりにバッファーを返すことができます。それ以外の場合は、接続を解放する前に、呼び出された が入力ストリームからのデータを処理できるようにコードを変更する必要があります。

于 2013-06-14T14:18:50.920 に答える