我正在使用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()的调用是在它到达我的实际代码修复错误之前在该上下文中进行的。
答案 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注入这样做是为读者留下的一个练习: - )