RestTemplate 自定义错误处理程序未捕获 ResourceAccessException
RestTemple custom error handler not catching 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 class 如下所示
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 并执行您的自定义错误处理程序。
我正在使用 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 class 如下所示
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 并执行您的自定义错误处理程序。