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

这篇具有很好参考价值的文章主要介绍了微服务中RestTemplate访问其他服务返回值转换问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景:

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

1. 调用接口(被调用接口我是统一返回json,也就是使用@RestController注解):

ReturnT responseEntity = restTemplate.postForObject("http://THPWPSERVICE/xx", 实体参数, ReturnT.class);

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

databind.exc.MismatchedInputException: Cannot construct instance of................

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

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

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

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

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

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

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

以下是一些常用调用方法:文章来源地址https://www.toymoban.com/news/detail-647767.html

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>() {});
又或者使用把参数与返回值掉转过来即可不需要拼接到url上
		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);

到了这里,关于微服务中RestTemplate访问其他服务返回值转换问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 局域网其他设备访问本机VMware虚拟机服务器

    在VMware虚拟机安装了nginx后,在宿主机的浏览器可以通过NAT模式访问,但使用局域网的其他机器就访问不了了, 此时可以通过设置WMware的虚拟网络来解决此问题。 1. 选择“编辑”-“虚拟网络编辑器” 2.  点击“更改设置”, 允许应用对您的设备进行更改 3. 选择“WMnet8” -

    2024年04月11日
    浏览(48)
  • 必看>>>>Linux数据库被其他服务器远程访问(修改权限、开设端口)

    目录 一:修改权限 1.1 进入Linux数据库 1.2 修改数据库的远程连接权限 1.2.1 数据库远程权限修改命令 1.2.2 数据库远程权限查看命名 1.3 给Linux机添加端口 1.4 远程数据库连接 文章中的四:Linux中mysql数据库的安装 1.2.1 数据库远程权限修改命令 grant all privileges on *.* to \\\'root\\\'@\\\'%\\\'id

    2023年04月17日
    浏览(112)
  • 关于 mac 本地配置域名能 ping 通,但是浏览器不能访问的问题(而其他电脑操作可访问)

    如下: 如下: 我还挺喜欢这种方式的,也不用修改 hosts 文件了,挺方便的。 配置了域名后,浏览器中输入域名不能访问,如下 ping 域名的等是对于配置了 hosts 文件的,注意一下。 如果本地有安装类似Clashx,需要关闭一下,没有的忽略此步骤 如下 确保没问题的话,继续往

    2024年02月16日
    浏览(53)
  • 用重建大师时,在主服务器建了一个快捷方式,给局域网其他电脑开了权限,其他电脑能正常访问主服务器数据吗?

    答:可以的,重建大师支持集群方式。数据放在服务器文件夹das,在主服务器读取数据建立了一个快捷方式,这个快捷方式给局域网其他电脑开了权限,其他电脑是可以通过快捷方式正常访问主服务器数据的。 重建大师是一款专为超大规模实景三维数据生产而设计的集群并行

    2024年01月18日
    浏览(47)
  • RestTemplate通过HTTPS协议访问接口

    RestTemplate 默认不支持https协议,需要支持有两种方式,第一种是忽略认证,第二种是导入证书(比第一种安全) 在这里只实现第一种方式,实现代码如下

    2024年02月11日
    浏览(45)
  • RestTemplate发起POST请求 突然返回错误码500,但相同的请求再postman中是可以调用

    一个之前一直跑的很正常的springboot项目,RestTemplate发起POST请求 突然一直返回错误码500,但相同的请求再postman中是可以调用的。 删除RestTemplateConfig中的 factory.setBufferRequestBody(false); 即可正常调用。 注意 :网上说bufferRequestBody 是标志是否使用缓存流的形式,默认是 true,缺点

    2024年02月12日
    浏览(51)
  • 让Docker容器内的服务能够访问宿主机上的其他容器的端口,可以使用Docker的网络功能

    要让Docker容器内的服务能够访问宿主机上的其他容器的端口,可以使用Docker的网络功能。 Docker提供了多种网络驱动程序,例如 bridge 、 host 、 overlay 等。其中, bridge 是默认的网络驱动程序,它会在每个Docker容器内创建一个虚拟的网卡,同时会为每个容器分配一个独立的IP地址

    2024年02月14日
    浏览(36)
  • 如何解决win11“无法枚举容器中的对象,访问被拒绝”、“右键新建只有文件夹,没有其他选项”的问题。

    形成原因:是文件夹Users权限的问题 解决方法:修改User权限即可 出错原因 我本以为按照网上的教程,右键E盘属性,找到安全选项卡,然后更改高级,然后更改所有者,然后开启 使用可从此对象继承的权限项目替换所有子对象的权限项目P,,,,等等操作。但是依然会报错

    2024年02月02日
    浏览(48)
  • 《凤凰架构》第二章——访问远程服务

    这章挺难的,感觉离我比较远,不太好懂,简单记录吧。 这章主要讲访问远程服务,主要对比了RPC和REST的区别,可以结合知乎上的文章《既然有 HTTP 请求,为什么还要用 RPC 调用?》 这篇文章进行理解。 而对于远程服务调用,它的内容不单单只有REST、RPC,还有像SOAP,WebS

    2024年02月11日
    浏览(45)
  • 使用RestTemplate访问https实现SSL请求操作,设置TLS版本

    注意:服务端TLS版本要和客户端工具类中定义的一致, 当支持的是列表时,能够与不同版本的客户端进行通信,在握手期间,TLS会选择两者都支持的最高的版本 javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure解决方案 方法升级JDK版本 全局设置优先级 代码里面的设置

    2024年02月01日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包