首页 > 解决方案 > 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,我应该怎么做?我是否在这里遗漏了什么或误解了自定义错误处理程序应该如何在这里工作?

标签: springerror-handlingresttemplate

解决方案


如果您完全提供一个不存在的 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 并执行您的自定义错误处理程序。


推荐阅读