RestTemple自定义错误处理程序未捕获ResourceAccessException

时间:2019-11-19 18:06:59

标签: spring error-handling resttemplate

我正在使用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,该怎么办?我在这里遗漏了什么吗?还是误解了自定义错误处理程序在这里应该如何工作?

1 个答案:

答案 0 :(得分:1)

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