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

编程教程 > Java (3551) 2025-01-27 10:26:38

问题描述

默认情况下,在使用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还是其它的都会返回结果

 


评论
User Image
提示:请评论与当前内容相关的回复,广告、推广或无关内容将被删除。

相关文章
问题描述默认情况下,在使用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 问题排查...
简介Spring Cloud Gateway中的全局异常处理不能直接用@ControllerAdvice来处理,通过跟踪异常信息的抛出,找到对应的源码,自定义一些处理逻辑来符合业务的需求
一、SpringBoot默认的错误处理机制1)浏览器,返回一个默认的错误页面2)如果是其他客户端(app),默认响应一个json数据(postman模拟)客户端
项目源码下载:(访问密码: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注...