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

Ice*_*nte 5 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));
Run Code Online (Sandbox Code Playgroud)

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

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

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 at org.springframework.web.client.RestTemplate.doExecute(RestTemplate .java:461)〜[spring-web-3.1.2.RELEASE.jar:3.1.2.RELEASE] org.springframework.web.client.RestTemplate.execute(RestTemplate.java:409)〜[spring-web- 3.1.2.RELEASE.jar:3.1.2.RELEASE]

不知道为什么会发生这种情况,但是我打开了调试器并为request.getBody()设置了一个监视表达式.在获取到我的实际代码之前,在该上下文中调用request.getBody()可以修复错误.

djb*_*djb 6

IOException抛出从sun.net.www.protocol.http.HttpURLConnectionRestTemplate默认使用。寻找在grepcode源,getInputStream()引发IOException如果HTTP状态代码是4XX(为404或410,它抛出一个更具体的FileNotFoundException

为了解决这个问题,您需要HttpURLConnection通过ClientHttpRequestFactory用作构造函数参数的提供不同的实现RestTemplate,或者使用requestFactory属性注入它。例如

 HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
 RestTemplate restTemplate = new RestTemplate(factory);
Run Code Online (Sandbox Code Playgroud)

通过 Spring 注入执行此操作是留给读者的练习:-)