我正在使用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,该怎么办?我在这里遗漏了什么吗?还是误解了自定义错误处理程序在这里应该如何工作?
答案 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,并且您的自定义错误处理程序将被执行。