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

标签 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 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() 修复错误。

最佳答案

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

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

 HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
 RestTemplate restTemplate = new RestTemplate(factory);

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

关于java - RestTemplate ClientHttpResponse.getBody() 抛出 I/O 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30356491/

相关文章:

java - 在 FunctionalJava.List 中, "snoc"是什么意思?

java - @RequestParam名称包含方括号[]

java - XML/REST Spring Web 服务中未考虑 @XmlElementWrapper

java - Android 编程中的另一个致命异常 MAIN

java - 如何获取所有可能的函数异常的列表

java - 将数组多次分成象限

java - 在 RestTemplate 拦截器中调用 execution.execute() 两次

java - 如何在spring boot中使用@Bean为抽象类创建bean

java - RestTemplate 如何解析响应

java - azure 逻辑应用程序请求触发器 url 无法在 RestTemplate java 中工作,但在 postman 中工作