error-handling - 如何在同一个 RestTemplate 中使用自定义的 ResponseErrorHandler 和 ClientHttpRequestFactory?
问题描述
我正在使用 RestTemplate 并添加了一个处理程序来处理一些错误:
@Configuration
public class IntegrationConfiguration {
@Bean
public RestTemplate restTemplate() {
return new RestTemplateBuilder()
.errorHandler(new CustomErrorHandler())
.setConnectTimeout(4000)
.setReadTimeout(4000)
.build();
}
这是 CustomErrorHandler 的实现:
public class CustomErrorHandler implements ResponseErrorHandler {
@Override
public boolean hasError(ClientHttpResponse response) throws IOException {
return response.getStatusCode().is4xxClientError() ||
response.getStatusCode().is5xxServerError();
}
@Override
public void handleError(ClientHttpResponse response) throws IOException {
final String body = new BufferedReader(new InputStreamReader(response.getBody()))
.lines().collect(Collectors.joining("\n"));
// more non important code...
}
但我明白了
java.net.HttpRetryException: cannot retry due to server authentication, in streaming mode
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1692)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492)
当我尝试response.getBody()
. 我找到了这个答案,但是要实现它,如果这个答案只接受扩展 ClientHttpRequestFactory 的类,我该如何设置 ClientHttpRequestFactory 实现(如上所示)?
ClientHttpRequestFactory 是一个功能接口。
解决方案
我设法使用带有 HttpRequestFactory 作为参数的构造函数并使用 setter 插入 ErrorHandler 来完成此操作:
@Bean
public RestTemplate restTemplate() {
final SimpleClientHttpRequestFactory httpRequestFactory = new SimpleClientHttpRequestFactory();
httpRequestFactory.setOutputStreaming(false);
httpRequestFactory.setConnectTimeout(config.getTimeOut()*1000);
httpRequestFactory.setReadTimeout(config.getTimeOut()*1000);
final RestTemplate restTemplate = new RestTemplate(httpRequestFactory);
restTemplate.setErrorHandler(new CustomErrorHandler());
return restTemplate;
}
推荐阅读
- c# - 有没有办法将双数组元素归因于字符串数组元素?
- python - 查找不固定长度的数字的所有可能排列以达到给定的总和或乘积
- javascript - 在 angularjs 中的 onInit() 方法中获取用户详细信息后尝试显示用户详细信息时出现错误
- product - 我要找的这个简单的服务目录+rest api产品是否存在?
- linux - 如何在使用 Yocto 构建的嵌入式系统上关闭控制台?
- javascript - 如何在带有参数的苗条商店中制作自定义方法?
- javascript - 在打字稿中访问Apache箭头表扫描中的值
- javascript - 尝试查找成员并接收无法读取未定义错误的属性“获取”
- css - 为什么在 iOS 版 Safari 上的链接上方和外部点击时,css 工具提示不会出现和消失?
- powerbi - Power BI Desktop Pro - 继续进行此更改将删除现有的刷新策略,因为它不再有效