spring - Autowired RestTemplate 返回不正确的 ResponseErrorHandler
问题描述
每个人。我现在在一个 Spring Boot 项目中工作,其中一个功能是将一些 HTTP 请求发送到第三方 API 并获取响应。
我决定用作 http 客户端,并在 java 文件中RestTemplate
创建了一个 beanRestTemplate
@Configuration
@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
restTemplate.setRequestFactory(new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory()));
List<ClientHttpRequestInterceptor> interceptors = restTemplate.getInterceptors();
if (CollectionUtils.isEmpty(interceptors)) {
interceptors = new ArrayList<>();
}
interceptors.add(new RequestLoggingInterceptor());
restTemplate.setInterceptors(interceptors);
restTemplate.setErrorHandler(new RestResponseErrorHandler());
return restTemplate;
}
自定义错误处理程序和日志拦截器设置在restTemplate
. 然后,我RestTemplate
通过
@Autowired
RestTemplate restTemplate;
但是,我发现我的自定义错误处理程序无法正常工作,我尝试通过以下方式检查错误处理程序
ResponseErrorHandler customErrorHandler = restTemplate.getErrorHandler();
我发现ErrorHandler
仍然是DefaultResponseErrorHandler
但不是我的自定义 errorHandler。为什么?有什么问题吗?
更新
下面是我的自定义错误处理程序和日志拦截器
public class RestResponseErrorHandler implements ResponseErrorHandler {
@Override
public boolean hasError(ClientHttpResponse response) throws IOException {
if (!response.getStatusCode().equals(HttpStatus.ACCEPTED)) {
return true;
}
return false;
}
@Override
public void handleError(ClientHttpResponse response) throws IOException {
if (!response.getStatusCode().equals(HttpStatus.ACCEPTED)) {
throw new RestResponseErrorException(response.getStatusCode() + "" + response.getStatusText());
}
}
}
和
public class RequestLoggingInterceptor implements ClientHttpRequestInterceptor {
private final Logger log = LoggerFactory.getLogger(this.getClass());
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
throws IOException {
logRequest(request, body);
ClientHttpResponse response = execution.execute(request, body);
logResponse(response);
return response;
}
private void logRequest(HttpRequest request, byte[] body) throws IOException {
if (log.isDebugEnabled()) {
log.debug("Request begin -----------------------------");
log.debug("URI:{}", request.getURI());
log.debug("Method:{}", request.getMethod());
log.debug("Headers:{}", request.getHeaders().toString());
log.debug("Request body:{}", new String(body, "UTF-8"));
log.debug("Request end -----------------------------");
}
}
private void logResponse(ClientHttpResponse response) throws IOException {
if (log.isDebugEnabled()) {
log.debug("Response begin -----------------------------");
log.debug("Status code:{}", response.getStatusCode());
log.debug("Status text:{}", response.getStatusText());
log.debug("Headers:{}", response.getHeaders().toString());
log.debug("Response body:{}", StreamUtils.copyToString(response.getBody(), Charset.defaultCharset()));
log.debug("Response end -----------------------------");
}
}
}
解决方案
推荐阅读
- r - 图例未显示在 R 图中
- reactjs - create-react-app 即插即用 Eslint 错误
- c# - C# 中的 JSON 序列化 - 对象中的对象
- java - 如何从哈希图中检索值,其中键是vaadin中的组合框项
- mongodb - Mongo领域功能。数组上的 $push 和其他上的 $set
- javascript - 添加 compilerOptions 后 VS Code 代码导航不起作用
- pandas - 无法导入所需的依赖项:numpy
- c# - MySQL 连接似乎只读取第一个查询
- graph - 如何更改 Grafana 中图形的轴和图例字体?
- informatica - 如何在 IICS 中将 NULL 值设置为单个字符?