Springboot RestTemplate将返回数据转换为指定类型

一、前言

在Springboot项目中需要调用外部接口,使用的是RestTemplate,但是返回数据的时候,返回了LinkedHashMap,先前考虑怎么将LinkedHashMap转成Java对象,先转成JSON对象再转回Java对象等等,都不成功。后来转念一想,可不可以直接在返回的时候,直接转换成我想要的Java对象呢,经过一番查询资料,发现是可以的。

二、问题场景

调用第三方接口代码:

RestTemplate restTemplate = new RestTemplate();
Map<String, Object> map = new HashMap();
map.put("XXX", XXX);
ResponseEntity responseEntity = null;
try {
    responseEntity = restTemplate.postForEntity(URL, dataPlatformReq, DataPlatformResp.class, map);
} catch (Exception e) {
    e.printStackTrace();
    throw new BaseRuntimeException(new MutableCodeMessage("1", "第三方接口异常", ExceptionLevel.LEVEL_FATAL));
}

其中,返回体DataPlatformResp如下:

@Data
public class DataPlatformResp<T> {

    private String code;

    private String msg;

    private int total;

    private List<T> data;
}

在执行之后,responseEntity返回的数据如下:

image-20210914102920647

返回的data是LinkedHashMap,但我想要的是转成自己的Java对象,也就是DataPlatformResp<T>里的泛型T,经过查阅资料,发现restTemplate.exchange可以实现这个。

三、restTemplate.exchange

修改上面的代码成:

RestTemplate restTemplate = new RestTemplate();
Map<String, Object> map = new HashMap();
map.put("XXX", XXX);
HttpEntity<?> httpEntity = new HttpEntity<>(map, null);
ResponseEntity responseEntity = null;
try {
    responseEntity = restTemplate.exchange(URL, HttpMethod.POST, httpEntity, new ParameterizedTypeReference<DataPlatformResp<CompanyImportVo>>() {});
} catch (Exception e) {
    e.printStackTrace();
    throw new BaseRuntimeException(new MutableCodeMessage("1", "第三方接口异常", ExceptionLevel.LEVEL_FATAL));
}

其中,new ParameterizedTypeReference<DataPlatformResp<CompanyImportVo>>() {}可以指定返回类型。此时,获取到的返回数据已转换成Java对象。

image-20210914103727885


版权声明:本文为yangguang_98原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。