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()可以修复错误.
在IOException抛出从sun.net.www.protocol.http.HttpURLConnection它RestTemplate默认使用。寻找在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 注入执行此操作是留给读者的练习:-)
| 归档时间: |
|
| 查看次数: |
6340 次 |
| 最近记录: |