RestTemplate ClientHttpResponse.getBody() 抛出 I/O 错误
RestTemplate ClientHttpResponse.getBody() throws I/O Error
我正在使用 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));
我现在正在针对 returns 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 error:
Server returned HTTP response code: 422 for URL:
https://testurl.com/admin/orders/564/fulfill.json;
nested exception is java.io.IOException: Server returned HTTP response
code: 422 for 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] at
org.springframework.web.client.RestTemplate.execute(RestTemplate.java:409)
~[spring-web-3.1.2.RELEASE.jar:3.1.2.RELEASE]
不确定为什么会发生这种情况,但我打开了调试器并为 request.getBody() 设置了一个监视表达式。在到达我的实际代码之前,在该上下文中调用 request.getBody() 修复 错误。
从 sun.net.www.protocol.http.HttpURLConnection
抛出的 IOException
默认情况下 RestTemplate
使用。查看 grepcode 中的源代码,如果 HTTP 状态代码为 4xx(对于 404 或 410,它会抛出更具体的 FileNotFoundException
)
,getInputStream()
会抛出 IOException
为了解决这个问题,您需要通过 ClientHttpRequestFactory
提供不同的 HttpURLConnection
实现,用作 RestTemplate
的构造函数参数,或者使用 requestFactory
属性。例如
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
RestTemplate restTemplate = new RestTemplate(factory);
通过 Spring 注入执行此操作是留给 reader :-)
的练习
我正在使用 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));
我现在正在针对 returns 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 error: Server returned HTTP response code: 422 for URL: https://testurl.com/admin/orders/564/fulfill.json; nested exception is java.io.IOException: Server returned HTTP response code: 422 for 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] at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:409) ~[spring-web-3.1.2.RELEASE.jar:3.1.2.RELEASE]
不确定为什么会发生这种情况,但我打开了调试器并为 request.getBody() 设置了一个监视表达式。在到达我的实际代码之前,在该上下文中调用 request.getBody() 修复 错误。
从 sun.net.www.protocol.http.HttpURLConnection
抛出的 IOException
默认情况下 RestTemplate
使用。查看 grepcode 中的源代码,如果 HTTP 状态代码为 4xx(对于 404 或 410,它会抛出更具体的 FileNotFoundException
)
getInputStream()
会抛出 IOException
为了解决这个问题,您需要通过 ClientHttpRequestFactory
提供不同的 HttpURLConnection
实现,用作 RestTemplate
的构造函数参数,或者使用 requestFactory
属性。例如
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
RestTemplate restTemplate = new RestTemplate(factory);
通过 Spring 注入执行此操作是留给 reader :-)
的练习