微服务中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);
相关推荐
xcl09251 小时前
北京24小时自助健身房系统软件开发实战:从架构到部署全流程指南
java·spring boot·架构
萧瑟余晖5 小时前
Dubbo SPI扩展机制详解
架构·dubbo
Shulex5 小时前
面向跨境电商多渠道消息系统的技术架构:亚马逊站内信合规对接与自动化执行链路设计
运维·架构·自动化
吴建旭 智宅焕6 小时前
AI搜索时代的智能家居交付知识架构:官网作为可信一手信息源与全国交付基础设施
人工智能·架构·智能家居
孟健6 小时前
出海开发者资金合规:从港卡结汇到完税申报实操
后端·架构
梦帮科技6 小时前
领域认知知识库图谱注入:从双式记账图网络到高质量问答对自动化合成流水线
运维·网络·数据库·人工智能·矩阵·架构·自动化
逐流人7 小时前
Ceph分布式存储集群配置与池管理:从配置优先级到PG、复本池与纠删码池
运维·分布式·ceph·云原生·云计算·rados
海宇服务7 小时前
零信任架构实战:基于海宇车型识别精准构建自动化定损网关
运维·人工智能·架构·自动化
悟天特斯8 小时前
边缘计算赋能楼宇智能化:云边协同的实时闭环与自治架构
人工智能·架构·边缘计算
爱学习的程序媛9 小时前
2. 智能应用开发技术栈清单
ai·架构·系统架构·ai应用·智能体开发·智能应用开发