Spring RestTemplate 映射复杂(嵌套)实体类
项目场景:
RestTemplate调用远程接口映射值
问题描述:
- 【说明】:
1、远程请求响应结果为对象中嵌套list
2、外层实体类属性存在数据
3、 list中实体类映射为null
代码:
【controller层】
@RestController
@RequestMapping("/CaseRecord")
public class CaseRecordController {
@Resource
RestTemplate restTemplate;
@GetMapping("/getEmrVisitInfo")
public AjaxResult getEmrVisitInfo() {
String url = "https://www.fastmock.site/mock/d68caaaf31d14183e559e0591316fdfb/xikang/geturl";
ResponseEntity<Root> rootResponseEntity = restTemplate.getForEntity(url, Root.class);
System.out.println(rootResponseEntity);
return null;
}
}
【Entity层】:
【Root.java】:
package com.ruoyi.xikang.entity.medic;
import com.fasterxml.jackson.annotation.JsonUnwrapped;
import com.ruoyi.xikang.entity.JsonRootBeanEntity;
import lombok.Data;
import java.util.List;
@Data
public class Root {
@JsonUnwrapped
private List<JsonRootBeanEntity> datalist;
private String msg;
private String status;
}
【JsonRootBeanEntity.java】:
/**
* Copyright 2021 bejson.com
*/
package com.ruoyi.xikang.entity;
import lombok.Data;
import java.util.Date;
/**
* Auto-generated: 2021-08-02 10:51:32
*
* @author bejson.com (i@bejson.com)
* @website http://www.bejson.com/java2pojo/
*/
@Data
public class JsonRootBeanEntity {
private String BED;
private String BODYPART_CODE;
private Date BUSINESS_DATE;
private String CARDNO;
private String CARDTYPE;
private String CYRQ;
private String DOCUMENTID;
private String DPT_CODE;
private String DPT_NAME;
private String INSERTDATE;
private String MDIS_CODE;
private String MDIS_NAME;
private String MEDICINE;
private String NAME;
private String OP_EM_NO;
private String OP_EM_NO_MARK;
private String RYRQ;
private String TABLENAME;
private String TABLEPK;
private String UNITCODE;
private String UNITNAME;
private String UPDATEDATE;
private String WARD_NAME;
}
【数据格式】:
{
"datalist": [{
"BED": "20210301",
"BODYPART_CODE": "202103011",
"BUSINESS_DATE": "2020-07-30",
"CARDNO": "xxxx",
"CARDTYPE": "01",
"CYRQ": "20210301133028",
"DOCUMENTID": "",
"DPT_CODE": "A99",
"DPT_NAME": "其他科室",
"INSERTDATE": "",
"MDIS_CODE": "N76.121",
"MDIS_NAME": "慢性炎",
"MEDICINE": "妇用抗菌洗液",
"NAME": "王钱",
"OP_EM_NO": "32130",
"OP_EM_NO_MARK": "1",
"RYRQ": "202007338",
"TABLENAME": "",
"TABLEPK": "",
"UNITCODE": "321311PDY41",
"UNITNAME": "医院",
"UPDATEDATE": "",
"WARD_NAME": ""
},
{
"BED": "20210",
"BODYPART_CODE": "",
"BUSINESS_DATE": "2020-06-29",
"CARDNO": "xxxx",
"CARDTYPE": "01",
"CYRQ": "2021030113",
"DOCUMENTID": "",
"DPT_CODE": "A.01",
"DPT_NAME": "普业",
"INSERTDATE": "",
"MDIS_CODE": "N61.x04",
"MDIS_NAME": "乳炎",
"MEDICINE": "",
"NAME": "王勤",
"OP_EM_NO": "3348",
"OP_EM_NO_MARK": "1",
"RYRQ": "20200629",
"TABLENAME": "",
"TABLEPK": "",
"UNITCODE": "321302",
"UNITNAME": "第一人民医院",
"UPDATEDATE": "",
"WARD_NAME": ""
}
],
"msg": "查询成功!",
"status": "success"
}
原因分析:
【参考】:https://www.it1352.com/1568252.html
- 【分析】:
1、响应信息中外层属性有值,内层为空
2、可能是内层类型有关
3、尝试将list中类型改成Object尝试
private List<JsonRootBeanEntity> datalist; => private List<Object> datalist;
- 【说明】:
1、数据装载成功
2、注意list中类型为LinkedHashMap
3、因此可能和属性映射有关
解决方案:
1、在外层实体类的list上添加@JsonUnwrapped注解
2、在list中类属性上添加@JsonProperty注解
- 【说明】:
1、此时list中类型修改成自定义类型
2、@JsonUnwrapped:扁平对象
3、@JsonProperty:把该属性的名称序列化为另外一个名称