Как исправить ошибку "поток закрыт" при использовании клиента CXF-RS?

Я использую клиент CXF-RS rest для отправки двоичного файла на сервер, и я получаю эту ошибку:

Caused by: java.io.IOException: stream is closed
    at sun.net.www.http.ChunkedInputStream.ensureOpen(ChunkedInputStream.java:174)
    at sun.net.www.http.ChunkedInputStream.available(ChunkedInputStream.java:718)
    at java.io.FilterInputStream.available(FilterInputStream.java:168)
    at org.apache.cxf.helpers.IOUtils.toString(IOUtils.java:213)
    at org.apache.cxf.helpers.IOUtils.toString(IOUtils.java:203)
    at org.apache.cxf.jaxrs.provider.PrimitiveTextProvider.readFrom(PrimitiveTextProvider.java:51)
    at org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBodyReader(JAXRSUtils.java:1280)
    at org.apache.cxf.jaxrs.impl.ResponseImpl.doReadEntity(ResponseImpl.java:323)

Я думаю, что журнал на стороне клиента регистрирует / закрывает двоичный поток, а затем сервер выдает мне эту ошибку, когда он пытается прочитать из него.

Вот мой код на стороне клиента:

        List<Object> providers = new ArrayList<>();
        providers.add(new JacksonJaxbJsonProvider());

        WebClient client = WebClient.create("http://localhost:8080/images", providers).accept(MediaType.APPLICATION_JSON).type(MediaType.APPLICATION_JSON);
        ClientConfiguration config = WebClient.getConfig(client);

        config.getInInterceptors().add(new LoggingInInterceptor());
        config.getOutInterceptors().add(new LoggingOutInterceptor());
        String response = handleErrors("", client.type(MediaType.APPLICATION_OCTET_STREAM_TYPE).post(imageData));

Я погуглил эту ошибку и обнаружил, что эта статья объясняет, как решить проблему: http://cxf.547215.n5.nabble.com/quot-Stream-is-closed-quot-Exception-when-upgrade-from-CXF-2-3-3-to-CXF-2-4-0-td4385277.html

Все, что мне нужно сделать, чтобы это исправить - это удалить эти строки для ведения журнала на стороне клиента следующим образом:

        List<Object> providers = new ArrayList<>();
        providers.add(new JacksonJaxbJsonProvider());

        WebClient client = WebClient.create("http://localhost:8080/images", providers).accept(MediaType.APPLICATION_JSON).type(MediaType.APPLICATION_JSON);
        ClientConfiguration config = WebClient.getConfig(client);

        //config.getInInterceptors().add(new LoggingInInterceptor());
        //config.getOutInterceptors().add(new LoggingOutInterceptor());
        String response = handleErrors("", client.type(MediaType.APPLICATION_OCTET_STREAM_TYPE).post(imageData));

Очевидно, я не хочу отключать ведение журнала, поскольку это является ключом к устранению неполадок. Есть ли другой способ обойти это? Ссылка, которую я дал выше, говорит:

Я считаю, что Алессио или Дэн исправили регрессию в 2.4.1-SNAPSHOT

Но я не уверен, что это значит. Я использую эту зависимость:

    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-rs-client</artifactId>
        <version>3.0.4</version>
    </dependency>

Похоже, я далеко от этой версии. Тем не менее, мои тесты находятся в том же classpath, что и мой сервер, который также является CXF, поэтому, может быть, сначала загружается версия остальных клиентов до 2.4.1.-SNAPSHOT? Я распечатал мой effective:pom и единственная зависимость от cxf-rt-rs-client - это версия 3.0.4.

0 ответов

Другие вопросы по тегам