springboot中restTemplate请求异常处理
问题解决办法
在使用默认配置的RestTemplate请求时,如果接口失败会执行抛出异常,而无法获取到错误编码和信息。
解决办法: 可以在初始化时添加自定义错误处理类,这样在请求时遇到请求异常,就会返回正常的错误对象。
@SpringBootApplication
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
@Bean
public RestTemplate getRestTemplate() {
RestTemplate restTemplate = new RestTemplate();
//设置restTemplate的默认异常处理器为自定义的处理器
restTemplate.setErrorHandler(new CustomErrorHandler());
//修改restTemplate默认编码格式为UTF-8
List<HttpMessageConverter<?>> messageConverters = restTemplate.getMessageConverters();
for (int i = 0; i < messageConverters.size(); i++) {
HttpMessageConverter<?> messageConverter = messageConverters.get(i);
if (messageConverter.getClass().equals(StringHttpMessageConverter.class)) {
messageConverters.set(i, new StringHttpMessageConverter(StandardCharsets.UTF_8));
}
}
return restTemplate;
}
}
注:CustomErrorHandler为异常处理实现类
public class CustomErrorHandler implements ResponseErrorHandler {
Logger logger = LoggerFactory.getLogger(this.getClass());
/**
* 表示 response 是否存在任何错误。实现类通常会检查 response 的 HttpStatus。
*
* @param response
* @return
* @throws IOException
*/
@Override
public boolean hasError(ClientHttpResponse response) throws IOException {
int rawStatusCode = response.getRawStatusCode();
HttpStatus statusCode = HttpStatus.resolve(rawStatusCode);
return (statusCode != null ? statusCode.isError() : hasError(rawStatusCode));
}
protected boolean hasError(int unknownStatusCode) {
HttpStatus.Series series = HttpStatus.Series.resolve(unknownStatusCode);
return (series == HttpStatus.Series.CLIENT_ERROR || series == HttpStatus.Series.SERVER_ERROR);
}
/**
* 处理 response 中的错误, 当 hasError 返回 true 时才调用此方法。
* 当返回异常信息时自己想要做的一些操作处理
*
* @param response
* @throws IOException
*/
@Override
public void handleError(ClientHttpResponse response) throws IOException {
}
/**
* 覆盖了上面的方法
* 处理 response 中的错误, 当 hasError 返回 true 时才调用此方法。
* 当返回异常信息时自己想要做的一些操作处理
*
* @param url
* @param method
* @param response
* @throws IOException
*/
@Override
public void handleError(URI url, HttpMethod method, ClientHttpResponse response) throws IOException {
logger.error("=======================ERROR============================");
logger.error("HOST:{},URI:{}", url.getHost(), url.getPath());
logger.error("Method Type:{}", method.name());
logger.error("Exception:{}", response.getStatusCode());
logger.error("========================================================");
}
}