使用Spring RestTemplate,出现错误时如何记录响应?

时间:2018-09-26 14:36:49

标签: spring-mvc spring-boot

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);
  }

但是它总是告诉我输入流是关闭的。这是错误还是我遗漏了一些东西?

1 个答案:

答案 0 :(得分:0)

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

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

如果您想始终在错误时记录响应正文而不需要捕获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;
        }
    }
}

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

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