RestTemplate ClientHttpResponse.getBody()抛出I / O错误

时间:2015-05-20 17:27:49

标签: java spring resttemplate

我正在使用Spring RestTemplate进行RESTful调用。我还使用自定义ClientHttpRequestInterceptor来记录请求和响应以进行调试。

为了多次读取响应(一次用于记录,一次用于处理)我使用BufferingClientHttpRequestFactory。这是设置:

ClientHttpRequestInterceptor ri = new LoggingRequestInterceptor();
List<ClientHttpRequestInterceptor> ris = new ArrayList<ClientHttpRequestInterceptor>();
ris.add(ri);
restTemplate.setInterceptors(ris);
restTemplate.setRequestFactory(new InterceptingClientHttpRequestFactory(
        new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory()) , ris));

我现在正在针对返回422响应并且遇到问题的请求测试此系统。从我的自定义ClientHttpRequestInterceptor的拦截方法中:

ClientHttpResponse response = execution.execute(request, body);
if(response.getBody() != null) {
    logger.trace(IOUtils.toString(response.getBody(), "UTF-8"));
}

response.getBody()抛出异常:

  

org.springframework.web.client.ResourceAccessException:I / O错误:   服务器返回HTTP响应代码:422为URL:   https://testurl.com/admin/orders/564/fulfill.json;   嵌套异常是java.io.IOException:服务器返回HTTP响应   代码:422用于URL:   https://testurl.com/admin/orders/564/fulfill.json     在   org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:461)   〜[spring-web-3.1.2.RELEASE.jar:3.1.2.RELEASE] at   org.springframework.web.client.RestTemplate.execute(RestTemplate.java:409)   〜[弹簧网络3.1.2.RELEASE.jar:3.1.2.RELEASE]

不确定为什么会发生这种情况,但我打开了调试器并为request.getBody()设置了监视表达式。对request.getBody()的调用是在它到达我的实际代码修复错误之前在该上下文中进行的。

1 个答案:

答案 0 :(得分:3)

默认情况下IOException使用的sun.net.www.protocol.http.HttpURLConnection引发的RestTemplate。{1}}查看grepcode中的源代码,getInputStream()如果HTTP状态代码为4xx则抛出IOException(对于404或410,它会抛出更具体的FileNotFoundException

要解决此问题,您需要通过HttpURLConnection提供不同的ClientHttpRequestFactory实现,该实现用作RestTemplate的构造函数参数,或者使用{{1}注入其中属性。例如

requestFactory

通过Spring注入这样做是为读者留下的一个练习: - )