前言:

重要,RestTemplate在SpringBoot项目里即便通过HttpMessageConverters添加了Fastjson且优先级比jackson要高也不会在RestTemplate里生效

,换句话说RestTemplate如果要使用Fastjson还是要对RestTemplate进行额外配置,而不是在SpringBoot项目里配置了类型是HttpMessageConverters的Bean就可以了;

方式可以参考:https://www.jianshu.com/p/c9644755dd5e

一:没有泛型的情况(这里以POST举例,但是对于GET也是一样的)

CommonResponse response = restTemplate.postForObject(remoteUrl, tokenRequest, CommonResponse.class);

这里tokenRequest是请求体对象,将会由Fastjson序列化为JSON字符串,它所属的类无所谓是不是有泛型,因为可以通过member.getClass()获得(即tokenRequest中所有的成员的类型是确立的且可获取的);

使用的时候最好用restTemplate.postForEntity()的而不要用restTemplate.postForObject(),后者不能设置Header,而且似乎也不能执行Multipart请求;

二:有泛型的情况

CommonResponse<TokenDataModel> response = restTemplate.postForObject(remoteUrl, tokenRequest, CommonResponse.class);

这个时候就有问题了,因为CommonResponse在字节码里是泛型擦除的,它所有的泛型成员本质上就是一个Object类型的子类但是.class里没有记录到底是什么具体类,因此当获取的response的JSON字符串中:

{
"code": 8209,
"code_description": "APPLICANT_SUCCESS",
"data": {
"cell_phone_number": "1111111111",
"collect_website": "中国联通","token": "77785fb276ed47cb9a01ec52f9a133c8"
},
"message": "成功"
}

将data部分转换为泛型成员时RestTemplate将不知道该怎么转换,如果将T类型认为是Object,那么显然Object是没有cellPhoneNumber之类的属性的,所以RestTemplate的做法是将data部分的JSON字符串转换为了LinkedHashMap对象(key-value对);

三:解决方式

通过RestTemplate的exchange方法来解决:

ParameterizedTypeReference<CommonResponse<TokenDataModel>> typeRef = new ParameterizedTypeReference<CommonResponse<TokenDataModel>>() {};
// exchange并不对应于任何一种method,如GET、POST、PUT、DELETE,因此需要手动指定
CommonResponse<TokenDataModel> response = restTemplate.exchange(remoteUrl, HttpMethod.POST, new HttpEntity<>(tokenRequest), typeRef).getBody();

四:单纯用Fastjson转换有泛型的类的方式

CommonResponse<TokenDataModel> response = JSON.parseObject("{json string}", new com.alibaba.fastjson.TypeReference<CommonResponse<TokenDataModel>>(){});

五:原理

在java里,泛型类编译成.class后确实是泛型擦除,但是泛型类对象里是会(间接)存储泛型的实际类型的,因此需要new TypeReference<Test<RealType>>(){}产生一个对象;

它内部是:

// 获取匿名类对象的Generic父类,即Test<RealType>类型
// 注意superClass并不是Class类对象,它应该理解为:
// 为泛型类的子匿名类对象产生的一个与之一一对应的Type类对象(这个倒像真泛型)
// 这个Type类对象里存储了此匿名类对象的所有泛型信息
Type superClass = getClass().getGenericSuperclass();

RestTemplate将响应数据转换为具有泛型的类对象的更多相关文章

  1. 使用Typescript重构axios(十三)——让响应数据支持泛型

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  2. Java框架之SpringMVC 03-RequestMapping-请求数据-响应数据

    SpringMVC SpringMVC是一种轻量级的.基于MVC的Web层应用框架. 通过一套 MVC 注解,让 POJO 成为处理请求的控制器,而无须实现任何接口. 采用了松散耦合可插拔组件结构,比 ...

  3. jQuery-1.9.1源码分析系列(十六)ajax——响应数据处理和api整理

    ajax在得到请求响应后主要会做两个处理:获取响应数据和使用类型转化器转化数据 a.获取响应数据 获取响应数据是调用ajaxHandleResponses函数来处理. ajaxHandleRespon ...

  4. 接口测试时数据格式是json,如何将响应内容转换为字典解析

    import requests url = 'http://127.0.0.1:5050/index' def apiTestPost(url): datas = { 'a':'cisco3', 'b ...

  5. 使用Typescript重构axios(六)——实现基础功能:获取响应数据

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  6. 使用Typescript重构axios(十六)——请求和响应数据配置化

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  7. SpringMvc响应数据和结果视图

    响应数据和结果视图 返回值分类 字符串 controller 方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址. //指定逻辑视图名,经过视图解析器解析为 jsp 物理路径:/WEB ...

  8. Jmeter-BeanShell断言的运用一(JSON响应数据与数据库比对)

    前言 最近在学习BeanShell断言,发现有点强大哈,只要会写代码,就没有什么是断言不了的,哈哈哈,不过我现在只会写点蹩脚的代码,下面将介绍下如何将返回的JSON数据与数据库数据做对比. 注:本次涉 ...

  9. 【SpringMVC】SpringMVC 响应数据

    SpringMVC 响应数据 文章源码 返回值分类 返回值是字符串 Controller 方法返回字符串可以指定逻辑视图的名称,通过视图解析器解析为物理视图的地址. @Controller @Requ ...

随机推荐

  1. C#字符串长度判断

    string aaa = "你好123"; Label1.Text = aaa.Length.ToString();  //结果5 Label2.Text = System.Tex ...

  2. day 26 初识进程,验证客户端合法性

    验证客户端合法性: # 1.需要认证 # 程序和用户打交道的时候才会用到用户认证 # 对所有的客户端进行统一的认证 # 我现在要做的事情 # 写一个server端 # 写一个client端 特殊的 符 ...

  3. IEDriver executable needs to be available in the path

    解决办法: 去http://selenium-release.storage.googleapis.com/index.html 下载指定IE版本 解压后 拷贝到Python的目录下 重新运行,提示错 ...

  4. linux如何搭建sftp服务器

    工具/原料   centos7.2_x64 方法/步骤   创建sftp组 groupadd sftp 创建完成之后使用cat /etc/group命令组的信息   2 创建一个sftp用户mysft ...

  5. 移动端input 无法获取焦点的问题

    下午遇到一个问题,移动端的input都不能输入了,后来发现是 -webkit-user-select :none ; 在移动端开发中,我们有时有针对性的写一些特殊的重置,比如: * { -webkit ...

  6. 故障处理分析:华为5885v3 cable/ Interconnect (LEFT Panel)

    故障现象: 处理结果: 1.重新把插左前面板,重启,故障消失.

  7. 什么是MVVM模式

    问题引入1 场景一:团队辛辛苦苦完成了一个项目,抱着激动的心情去给用户做demo,而用户给你的反馈是UI很不满意,要重新修改,否则拒绝验收.大规模修改UI,晴天霹雳!2 场景二:产品在一家客户上线运行 ...

  8. Ubuntu 软件包管理工具 dpkg, APT 的一些命令(转载)

    转载地址: http://www.dreamxu.com/ubuntu-package-dpkg-and-apt-commands/ dpkg dpkg 是由 Debian 开发的包管理系统,是一个比 ...

  9. hdu 5532 (LIS) Almost Sorted Array

    http://acm.hdu.edu.cn/showproblem.php?pid=5532 题意大致是一组数中去掉一个数后问剩下的数是否构成非严格单调序列 正反各跑一遍最长非严格连续子序列,存在长度 ...

  10. vim自动添加tags、cscope

    每次打开一个工程都需要重新添加tags.cscope,很不方便,网上找了一下. 将其添加到 ~/.vimrc 中之后,打开 vim 就会自动搜索当前路径下的tags.cscope添加进去. 自动添加 ...