在Spring Boot应用程序中使用RestTemplate时,当尝试与远程Web服务进行通信时,我们可能会遇到异常。其中之一是HttpServerErrorException,它表示HTTP 5xx错误代码(服务器错误)。在某些情况下,如果不正确配置RestTemplate,则可能会捕获到一个与HttpServerErrorException类似但不同的异常,即ResourceAccessException。这通常发生在以下两种情况下:
要避免捕获到ResourceAccessException,我们可以按如下方式配置RestTemplate:
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder, HttpClient httpClient) {
return builder
.requestFactory(() -> new HttpComponentsClientHttpRequestFactory(httpClient))
.errorHandler(new ResponseErrorHandler() {
@Override
public boolean hasError(ClientHttpResponse response) throws IOException {
return response.getStatusCode().is5xxServerError();
}
@Override
public void handleError(ClientHttpResponse response) throws IOException {
throw new HttpServerErrorException(response.getStatusCode());
}
})
.build();
}
在这个配置中,我们使用一个自定义的HttpComponentsClientHttpRequestFactory,它基于自定义的HttpClient(在此示例中省略实现)构建。此外,我们还提供了一个自定义的ResponseErrorHandler,该处理程序检查HTTP响应是否为5xx(服务器错误),如果是,则抛出HttpServerErrorException。