首页 > 解决方案 > Autowired RestTemplate 返回不正确的 ResponseErrorHandler

问题描述

每个人。我现在在一个 Spring Boot 项目中工作,其中一个功能是将一些 HTTP 请求发送到第三方 API 并获取响应。

我决定用作 http 客户端,并在 java 文件中RestTemplate创建了一个 beanRestTemplate@Configuration

@Bean
public RestTemplate restTemplate() {
    RestTemplate restTemplate = new RestTemplate();

    restTemplate.setRequestFactory(new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory()));
    List<ClientHttpRequestInterceptor> interceptors = restTemplate.getInterceptors();
    if (CollectionUtils.isEmpty(interceptors)) {
        interceptors = new ArrayList<>();
    }
    interceptors.add(new RequestLoggingInterceptor());
    restTemplate.setInterceptors(interceptors);
    restTemplate.setErrorHandler(new RestResponseErrorHandler());

    return restTemplate;
}

自定义错误处理程序和日志拦截器设置在restTemplate. 然后,我RestTemplate通过

@Autowired
RestTemplate restTemplate;

但是,我发现我的自定义错误处理程序无法正常工作,我尝试通过以下方式检查错误处理程序

ResponseErrorHandler customErrorHandler = restTemplate.getErrorHandler();

我发现ErrorHandler仍然是DefaultResponseErrorHandler但不是我的自定义 errorHandler。为什么?有什么问题吗?

更新

下面是我的自定义错误处理程序和日志拦截器

public class RestResponseErrorHandler implements ResponseErrorHandler {

@Override
public boolean hasError(ClientHttpResponse response) throws IOException {
    if (!response.getStatusCode().equals(HttpStatus.ACCEPTED)) {
        return true;
    }
    return false;
}

@Override
public void handleError(ClientHttpResponse response) throws IOException {
    if (!response.getStatusCode().equals(HttpStatus.ACCEPTED)) {
        throw new RestResponseErrorException(response.getStatusCode() + "" + response.getStatusText());
    }
}
}

public class RequestLoggingInterceptor implements ClientHttpRequestInterceptor {

private final Logger log = LoggerFactory.getLogger(this.getClass());

@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
    throws IOException {
    logRequest(request, body);
    ClientHttpResponse response = execution.execute(request, body);
    logResponse(response);
    return response;
}

private void logRequest(HttpRequest request, byte[] body) throws IOException {
    if (log.isDebugEnabled()) {
        log.debug("Request begin -----------------------------");
        log.debug("URI:{}", request.getURI());
        log.debug("Method:{}", request.getMethod());
        log.debug("Headers:{}", request.getHeaders().toString());
        log.debug("Request body:{}", new String(body, "UTF-8"));
        log.debug("Request end -----------------------------");
    }
}

private void logResponse(ClientHttpResponse response) throws IOException {
    if (log.isDebugEnabled()) {
        log.debug("Response begin  -----------------------------");
        log.debug("Status code:{}", response.getStatusCode());
        log.debug("Status text:{}", response.getStatusText());
        log.debug("Headers:{}", response.getHeaders().toString());
        log.debug("Response body:{}", StreamUtils.copyToString(response.getBody(), Charset.defaultCharset()));
        log.debug("Response end -----------------------------");
    }
}
}

标签: springerror-handlingautowiredresttemplateinject

解决方案


推荐阅读