请求外部接口返回结果中获取的data,如果直接用对象进行强转,则运行的时候会报错java.lang.ClassCastException: class java.lang.Object cannot be cast to class...
Response<Map<String,Object>> response = deviceClient.downFeature(deviceFeatureDto);
ParkingLotDto parkingLotDto = (ParkingLotDto) response.getData().get("data");
return parkingLotDto;
解决方案:
需要借助 com.fasterxml.jackson.databind.ObjectMapper 包下的 convertValue方法可将对象转换为对应的实体类对象,这里我们封装了一个工具类
private static ObjectMapper objectMapper = new ObjectMapper();
public static <T> T conveterObject(Object srcObject, Class<T> destObjectType) {
return objectMapper.convertValue(srcObject,destObjectType);
}
解决了数据类型转化问题,由于第三方协议的报文中json数据中参数首字母存在大写,在我编辑的对象中直接用该字段进行接收,发现一直返回的是null,原因是:数据在转换成json格式时,采用了默认的转换方式,如果字段首字段大写,那么解析的时候会去找首字段小写对应的字段。
解决方案:
直接类的属性上添加@JsonProperty 或者@JSONField,数据成功接收。
private String parkName;
@JSONField(name="GateInfoList")
@JsonProperty(value = "GateInfoList")
private List<GateDto> gateInfoList;
隔了不久又遇到了相似问题,设备上报的消息在处理后要求直接返回数据,在返回的对象里有属性首字母大写,我属性直接命名成大写,debug看返回对象里的属性还是大写,但是在设备的日志里看返回结果中url字段又变成了小写
在url对象上加上注解@JsonProperty,问题解决。