spring - RestTemple 自定义错误处理程序未捕获 ResourceAccessException
问题描述
我正在使用 RestTemplate 建立 Http 连接以从外部 API 获取数据。为此,我实现了一个自定义错误处理程序并将其设置在 restTemplate 对象上。下面是我的自定义错误处理程序
public class CustomResponseErrorHandler implements ResponseErrorHandler {
public boolean hasError(ClientHttpResponse response) throws IOException {
int rawStatusCode = response.getRawStatusCode();
if (rawStatusCode / 200 != 1) {
LOG.debug("HTTPS hasError - " + rawStatusCode + "; " + response.getStatusText() + "; " + response.getStatusCode());
return true;
}
return false;
}
public void handleError(ClientHttpResponse response) throws IOException {
int rawStatusCode = response.getRawStatusCode();
LOG.debug("HTTPS handleError - " + rawStatusCode + "; " + response.getStatusText() + "; " + response.getStatusCode());
}
}
我的 RestTemplateUtils 类如下所示
public class RestTemplateUtils {
RestTemplate restTemplate;
public ResponseEntity<String> restGet(String url) {
restTemplate.setErrorHandler(new CustomResponseErrorHandler());
ResponseEntity<String> response= restTemplate.getForEntity(url, String.class);
return response;
}
}
我希望restTemplate.getForEntity()
调用期间引发的任何错误都应该被捕获并记录下来,CustomResponseErrorHandler
但事实并非如此。当我传入一个不存在的 url 时ResponseEntity<String> response= restTemplate.getForEntity(url, String.class);
会抛出 ResourceAccessException。如果我希望我的自定义错误处理程序在这种情况下捕获 404,我应该怎么做?我是否在这里遗漏了什么或误解了自定义错误处理程序应该如何在这里工作?
解决方案
如果您完全提供一个不存在的 url,那么我认为代码不会到达执行错误处理程序的地步;看着RestTemplate#doExecute
doExecute(URI url, @Nullable HttpMethod method, @Nullable RequestCallback requestCallback,
@Nullable ResponseExtractor<T> responseExtractor)
代码
try {
ClientHttpRequest request = createRequest(url, method);
if (requestCallback != null) {
requestCallback.doWithRequest(request);
}
response = request.execute();
handleResponse(url, method, response);
return (responseExtractor != null ? responseExtractor.extractData(response) : null);
}
handleResponse
是查找错误处理程序的地方,但我认为您的错误处理程序在request.execute();
在服务器 api 路径上提供一些不存在的 url,然后您会从服务器收到 404 并执行您的自定义错误处理程序。
推荐阅读
- c++ - 当我用我的套接字代码发送第二条消息时,我有一个“sendto() 无效参数”
- c# - Acumatica - FieldUpdated - 勾选/取消勾选复选框时启用/禁用另一个控件
- javascript - 如何使用 javascript 或 nodejs 更新带有通用头文件的链接
- corda - 建立连接时的任意端口号
- python - 为类动态添加特殊方法不起作用
- sharepoint - SharePoint 2010 - 如果列表是从 ListTemplate 创建的,我们如何从列表中获取列表模板名称
- ios - 用于 iPad 的 UIViewController modalPresentationStyle 弹出框和用于 iPhone 的自定义
- php - 未定义的变量:mysql PHP中的名称
- javascript - 如何在产量上修复“未捕获的语法错误:意外的标识符”
- docker - 由于健康检查失败,AWS ELB 在几分钟内杀死 AWS ECS 中的 RabbitMQ 服务