RestTemplate处理非200返回_RestTemplate处理错误返回

位置:首页>文章>详情   分类: 教程分享 > Java教程   阅读(1738)   2023-03-28 11:29:14

问题描述

默认情况下,在使用spring的restTemplate调用接口,如果响应的http状态码是200则会成功返回数据。但是有些时候对方接口返回错误或失败的情况设置了非200的http状态码导致默认的restTemplate调用直接抛异常而不是直接得到对方的错误json信息。
 

RestTemplate源码分析

1.调试postForEntity请求的方法找到判断响应结果状态码的方法是org.springframework.web.client.DefaultResponseErrorHandler类中的hasError方法

@Override
public boolean hasError(ClientHttpResponse response) throws IOException {
	int rawStatusCode = response.getRawStatusCode();
	HttpStatus statusCode = HttpStatus.resolve(rawStatusCode);
	return (statusCode != null ? hasError(statusCode) : hasError(rawStatusCode));
}
代码再往上跟踪一级,如下:
protected void handleResponse(URI url, HttpMethod method, ClientHttpResponse response) throws IOException {
	ResponseErrorHandler errorHandler = getErrorHandler();
	boolean hasError = errorHandler.hasError(response);
	if (logger.isDebugEnabled()) {
		try {
			int code = response.getRawStatusCode();
			HttpStatus status = HttpStatus.resolve(code);
			logger.debug("Response " + (status != null ? status : code));
		}
		catch (IOException ex) {
			// ignore
		}
	}
	if (hasError) {
		errorHandler.handleError(url, method, response);
	}
}
从上面的代码可以看到是使用了RestTemplate的错误处理器,所以解决思路就是可以想办法自定义错误处理器;

解决/处理办法

自定义错误处理器如下所示
@Bean
public RestTemplate restTemplate(ClientHttpRequestFactory factory){
	RestTemplate restTemplate = new RestTemplate(factory);
	ResponseErrorHandler responseErrorHandler = new ResponseErrorHandler() {
		@Override
		public boolean hasError(ClientHttpResponse response) throws IOException {
			return true;
		}
		@Override
		public void handleError(ClientHttpResponse response) throws IOException {
		}
	};
	restTemplate.setErrorHandler(responseErrorHandler);
	return restTemplate;
}

注意说明
1.hasError默认写死true,都进;
2.handleError 为空,相当于跳过错误抛出

配置上方代码,以后不管状态码是200还是其它的都会返回结果

 
地址:https://www.leftso.com/article/912.html

相关阅读

问题描述默认情况下,在使用spring的restTemplate调用接口,如果响应的http状态码是200则会成功返回数据
HttpClient的RestTemplate - Java配置示例
演示项目源码下载:(访问密码:9987)spring-cloud-zipkin.zipZipkin是非常有效的工具分布追踪在微服务生态系统
简介Spring Cloud Gateway中的全局异常处理不能直接用@ControllerAdvice来处理,通过跟踪异常信息的抛出,找到对应的源码,自定义一些处理逻辑来符合业务的需求
学习使用Spring Batch分区使用多个线程来处理Spring Boot应用程序中的一系列数据集任务。1.并行处理和分区1.1 并行处理 大多数批处理问题可以使用单线程解决,但很少有复杂的场...
项目源码下载:(访问密码:9987)Spring-Cloud-Circuit-Breaker.zip学习在调用底层微服务的同时利用调用的Spring Cloud Netflix堆栈组件之一Hys...
Spring Boot 入门 AOP 日志处理,这里主要讲解spring boot 中采用AOP方式进行日志的统一处理。spring 框架的处理也是一样。综合来讲,本文主要讲解了spring b...
演示项目源码下载:(访问密码:9987)Spring-Cloud-discovery-server.zip 了解如何创建微服务的基础上,Spring Cloud,对Netflix的Eureka注...
项目源码下载:(访问密码:9987)spring-cloud-dashboards.zip在交付基于微服务的应用程序时,广泛使用 Spring Boot 和 Spring Cloud
从Spring 6和Spring Boot 3开始,Spring框架支持“HTTP API的问题详细信息”规范RFC 7807。本Spring Boot 教程将详细指导您完成这一新增强。1.问题...