首页 > 解决方案 > 使用 Spring RestTemplate,出现错误时如何记录响应?

问题描述

Spring RestTemplate 可以设置errorHandler,里面有处理错误的方法。我有一个像这样的错误处理程序

try (BufferedReader buffer = new BufferedReader(new InputStreamReader(clientHttpResponse.getBody()))) {
     final String response = buffer.lines().collect(Collectors.joining("\n"));
     System.out.println(response);
  }

但它总是告诉我输入流很接近。这是一个错误还是我错过了什么?

标签: spring-mvcspring-boot

解决方案


RestTemplate 的默认错误处理程序DefaultResponseErrorHandler已经读取响应正文并将其设置在HttpStatusCodeException它抛出的对象中。

try {
    restTemplate.getForObject("http://...", String.class);
} catch (HttpStatusCodeException e) {
    System.out.println("Received error: " + e.getResponseBodyAsString());
}

如果您想始终记录响应正文的错误而不需要 catch HttpStatusCodeException,您可以扩展默认的错误处理程序。

public static class LoggingErrorHandler extends DefaultResponseErrorHandler {
    @Override
    public void handleError(ClientHttpResponse response) throws IOException {
        try {
            super.handleError(response);
        } catch (HttpStatusCodeException e) {
            System.out.println("Error response body is " + e.getResponseBodyAsString());
            throw e;
        }
    }
}

在实例化 rest 模板时使用上述错误处理程序。

RestTemplate restTemplate = new RestTemplate();
restTemplate.setErrorHandler(new LoggingErrorHandler());
String response = restTemplate.getForObject("http://...", String.class);

推荐阅读