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

教程分享 > Java教程 > 博文分享 (4452) 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还是其它的都会返回结果

 

相关文章
问题描述默认情况下,在使用spring的restTemplate调用接口,如果响应的http状态码是200则会成功返回数据
HttpClient的RestTemplate - Java配置示例
学习使用Spring Batch分区使用多个线程来处理Spring Boot应用程序中的一系列数据集任务。1.并行处理和分区1.1 并行处理 大多数批处理问题可以使用单线程解决,但很少有复杂的场...
Spring Boot 入门 AOP 日志处理,这里主要讲解spring boot 中采用AOP方式进行日志的统一处理。spring 框架的处理也是一样。综合来讲,本文主要讲解了spring b...
环境说明spring cloud 2021.04 spring cloud alibaba 2021.0.4 spring boot 2.6.13 nacos 2.2.3 问题排查...
一、SpringBoot默认的错误处理机制1)浏览器,返回一个默认的错误页面2)如果是其他客户端(app),默认响应一个json数据(postman模拟)客户端
简介Spring Cloud Gateway中的全局异常处理不能直接用@ControllerAdvice来处理,通过跟踪异常信息的抛出,找到对应的源码,自定义一些处理逻辑来符合业务的需求
项目源码下载:(访问密码:9987)Spring-Cloud-Circuit-Breaker.zip学习在调用底层微服务的同时利用调用的Spring Cloud Netflix堆栈组件之一Hys...
演示项目源码下载:(访问密码:9987)spring-cloud-zipkin.zipZipkin是非常有效的工具分布追踪在微服务生态系统
前言spring boot 项目常用的几个类设计,方便快速搭建项目错误处理模块。代码片段 错误枚举定义@Getterpublic enum ErrorCodeE
错误信息 spring cloud 启动报错 No spring.config.import property has been defined 环境说明 spring ...
1. 什么是 spring cloud?spring cloud 是一系列框架的有序集合
随着Spring Cloud 的越来越流行,国内很多公司也在开始使用该框架了
演示项目源码下载:(访问密码:9987)Spring-Cloud-discovery-server.zip 了解如何创建微服务的基础上,Spring Cloud,对Netflix的Eureka注...