微服务中RestTemplate访问其他服务返回值转换问题

背景:

接收一个springcloud项目,UI模块访问其他服务的接口,返回数据统一都是使用fastjson进行转换,但是新开发了几个新模块之后发现fastjson很多bug(各种内存溢出),但是很多地方已经重度依赖fastjson,只是升级改掉了内存溢出的某些代码,最近突然想起来RestTemplate明明有定义返回值为啥不直接使用,因为我是为了统一规范,按照以前调用模块的写法进行开发,于是说试就试:

  1. 调用接口(被调用接口我是统一返回json,也就是使用@RestController注解):
java 复制代码
ReturnT responseEntity = restTemplate.postForObject("http://THPWPSERVICE/xx", 实体参数, ReturnT.class);

直接使用定义好的统一返回类型ReturnT进行接收返回值,然后访问页面无数据,后台报错如下:

java 复制代码
databind.exc.MismatchedInputException: Cannot construct instance of................

网上各种查询,发现原因是要想接收指定类型,这个指定类型必须继承序列化,且还必须有有参构造函数以及午餐构造函数,于是添加@AllArgsConstructor 、@NoArgsConstructor注解再implements Serializable,完整统一返回类型的实体定义如下:

重启程序,再次访问终于拿到数据了

以下记录下一些RestTemplate调用注意事项:

  1. 被调用接口如果形参是实体,那么就在实体之前加上注解@RequestBody,否则无法接收到参数

  2. 被调用接口如果形参是基础类型参数(如String、int类型等等),那么就在类型前加上注解@RequestParam,否则无法接收到参数

  3. 如果参数非实体类型,那么建议使用get请求 :

java 复制代码
 String json = restTemplate.getForObject("http://XXXSERVICE/getById?id="+id, String.class);

以下是一些常用调用方法:

java 复制代码
1. 带实体入参,使用post请求,layui表格返回值,直接返回json格式即可,无需解析
		return restTemplate.postForObject("http://THPWPSERVICE/supplies/getItems", form, String.class);  
	    2. 参数少,使用get请求	,返回json实体,再转成实体类,再返回页面
	     String json = restTemplate.getForObject("http://THPWPSERVICE/supplies/getByItemCode?itemCode="+itemCode, String.class);
            s = JSON.parseObject(json, new TypeReference<SuppliesItem>() {});
		3. 转list	
			ids = JSON.parseObject(json, new TypeReference<List>() { });
			
		4 .  BookDto bookDto = restTemplate.getForObject(url, BookDto.class);   -----待尝试
		5. ResponseEntity<BookDto> responseEntity = restTemplate.getForEntity(url, BookDto.class); -----待尝试
			//状态码
			System.out.println(responseEntity.getStatusCode());
			//获取头
			System.out.println("头:" + responseEntity.getHeaders());
			//获取body
			BookDto bookDto = responseEntity.getBody();
			
		6.  ResponseEntity<List<BookDto>> responseEntity =   -----待尝试
            restTemplate.exchange(url,
                    HttpMethod.GET,
                    null,
                    new ParameterizedTypeReference<List<BookDto>>() {
                    });
			List<BookDto> bookDtoList = responseEntity.getBody();

		7. BookDto result = restTemplate.postForObject(url, 参数, BookDto.class);
相关推荐
一条咸鱼_SaltyFish1 小时前
[Day14] 微服务开发中 `contract - common` 共享库的问题排查与解决
程序人生·微服务·架构·开源软件·ddd·个人开发·ai编程
没有bug.的程序员1 小时前
Service Mesh 与 Spring Cloud 共存方案:双体系治理、平滑迁移与风险控制实战指南
云原生·springcloud·流量治理·混合架构·servicemesh·微服务迁移·技术演进
一只鱼丸yo1 小时前
从单体到微服务:一次真实迁移实战
微服务·云原生·架构
桌面运维家2 小时前
vDisk VOI架构IO瓶颈怎么办?Windows优化实战
windows·架构
Blossom.1183 小时前
Transformer架构优化实战:从MHA到MQA/GQA的显存革命
人工智能·python·深度学习·react.js·架构·aigc·transformer
2501_939909053 小时前
k8s基础与安装部署
云原生·容器·kubernetes
Python_Study20253 小时前
制造业数据采集系统选型指南:从技术挑战到架构实践
大数据·网络·数据结构·人工智能·架构
喵叔哟4 小时前
8.健康检查与监控
架构·.net
DKunYu4 小时前
9.熔断和限流 - Alibaba Sentinel
spring cloud·微服务·sentinel
踏浪无痕5 小时前
JobFlow 负载感知调度:把任务分给最闲的机器
后端·架构·开源