我正在使用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));
我用Google搜索了这个错误,发现这篇文章解释了如何解决这个问题: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));
显然,我不想关闭日志记录,因为它是调试问题的关键。还有其他方法吗?我上面给出的链接说:
我相信Alessio或Dan在2.4.1-SNAPSHOT中修复了回归
但我不确定这意味着什么。我使用这种依赖:
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-client</artifactId>
<version>3.0.4</version>
</dependency>
似乎我已经过了那个版本。也就是说,我的测试与我的服务器(也是CXF)位于同一类路径中,所以可能首先加载其余客户端的2.4.1.-SNAPSHOT版本?我打印出我的effective:pom
,对cxf-rt-rs-client的唯一依赖是版本3.0.4。