RestTemplate将响应数据转换为具有泛型的类对象
前言:
重要,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将响应数据转换为具有泛型的类对象的更多相关文章
- 使用Typescript重构axios(十三)——让响应数据支持泛型
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- Java框架之SpringMVC 03-RequestMapping-请求数据-响应数据
SpringMVC SpringMVC是一种轻量级的.基于MVC的Web层应用框架. 通过一套 MVC 注解,让 POJO 成为处理请求的控制器,而无须实现任何接口. 采用了松散耦合可插拔组件结构,比 ...
- jQuery-1.9.1源码分析系列(十六)ajax——响应数据处理和api整理
ajax在得到请求响应后主要会做两个处理:获取响应数据和使用类型转化器转化数据 a.获取响应数据 获取响应数据是调用ajaxHandleResponses函数来处理. ajaxHandleRespon ...
- 接口测试时数据格式是json,如何将响应内容转换为字典解析
import requests url = 'http://127.0.0.1:5050/index' def apiTestPost(url): datas = { 'a':'cisco3', 'b ...
- 使用Typescript重构axios(六)——实现基础功能:获取响应数据
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- 使用Typescript重构axios(十六)——请求和响应数据配置化
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- SpringMvc响应数据和结果视图
响应数据和结果视图 返回值分类 字符串 controller 方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址. //指定逻辑视图名,经过视图解析器解析为 jsp 物理路径:/WEB ...
- Jmeter-BeanShell断言的运用一(JSON响应数据与数据库比对)
前言 最近在学习BeanShell断言,发现有点强大哈,只要会写代码,就没有什么是断言不了的,哈哈哈,不过我现在只会写点蹩脚的代码,下面将介绍下如何将返回的JSON数据与数据库数据做对比. 注:本次涉 ...
- 【SpringMVC】SpringMVC 响应数据
SpringMVC 响应数据 文章源码 返回值分类 返回值是字符串 Controller 方法返回字符串可以指定逻辑视图的名称,通过视图解析器解析为物理视图的地址. @Controller @Requ ...
随机推荐
- echarts横向柱状图Demo
echarts链接:http://gallery.echartsjs.com/editor.html?c=xByfdMz7mM 代码: option = { backgroundColor: 'bla ...
- 2017-2018-2 20165315 实验二《Java面向对象程序设计》实验报告
2017-2018-2 20165315 实验二<Java面向对象程序设计>实验报告 一.实验内容及步骤 1.初步掌握单元测试和TDD 单元测试 任务一:三种代码 用程序解决问题时,要学会 ...
- Mysql的随机抽取
方法一 SELECT * FROM SHARE ORDER BY RAND( ) LIMIT 1; 在MYSQL的官方手册,里面针对RAND()的提示大概意思就是,在ORDER BY从句里面不能使用R ...
- equals与“==”的区别
对于值类型,“==”比较的是不是同一数值,equals先比较是不是同一类型,在比较是不是同一数值: 对于引用类型,“==”和equals比较的都是是否引用了同一实例对象
- golang 创建一个简单的广播echo服务器
package main; import ( "net" "fmt" "bufio" ) //里面的代码部分参考cmu440课程 //htt ...
- (OS 64)指定的网络名不再可用,winnt_accept: Asynchronous AcceptEx failed.
在httpd.conf中添加 <IfModule mpm_winnt.c> ThreadsPerChild 150 MaxRequestsPerChild 10000 Win32Disab ...
- mysql命令行导入结构化数据
数据样本 103252765-|--|-stephanie_mt@hotmail.com-|-o/35+nGaNEU=-|-ion|-- 其中|为分隔符,每行的换行符\n mysql -uroot M ...
- vue 初识组件
Vue.component("greeting",{ template: `<p>{{ name }}大家好 <button v-on:click="c ...
- c#按照回车换行符分割字符串
string str="aaa\r\nbbscccjdddseee"; string[] sArray=str.Split(new char[2] {'\r','\n'}); 和用 ...
- Luogu 4556 雨天的尾巴 - 启发式合并线段树
Solution 用$col$记录 数量最多的种类, $sum$记录 种类$col$ 的数量. 然后问题就是树上链修改, 求 每个节点 数量最多的种类. 用树上差分 + 线段树合并更新即可. Code ...