spring-mvc - 使用 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);
}
但它总是告诉我输入流很接近。这是一个错误还是我错过了什么?
解决方案
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);
推荐阅读
- sparql - WIKIDATA/SPARQL:使用SERVICE wikibase时如何获取使用的语言:带有[AUTO_LANGUAGE]参数的标签
- prolog - 在 prolog 中打印变量名列表
- xgboost - 基于树模型的 Boxcox 变换(具体为 XGBoost)
- javascript - 根据主对象内另一个对象列表的属性值对复杂的javascript对象进行排序
- java - String index out of range on space bar character
- java - 你能告诉我我哪里做错了吗
- java - 如何停止 youtube 音乐?
- java - 为检查的异常绕过 try/catch 块的 lamdas
- c++ - 从基本模板调用方法无法编译
- python - 使用函数中的函数在 Python 中查找函数的根