在springcloud微服务调用返回数据时,出现获取数据为null的情况:
一开始我是用R继承hashmap然后定义一个私有属性data,没想到出错了,因为序列化过程中会忽略掉类的私有属性(继承hashmap的类),因此在反序列过程中会吧data的值丢失。
public class R<T> extends HashMap<String,T> {
private T data;
public void setData(T data){
this.data = (T) data;
};
public T getData(){
return data;
}
}
class t{
public static void main(String[] args) {
R r = new R();
r.setData(new Integer(1));
System.out.println(r.getData());
//序列化
String s = JSON.toJSONString(r);
System.out.println(s);
//反序列化
R r1 = JSON.parseObject(s, R.class);
System.out.println(r1.getData());
/**结果为
* 1
* {}
* null
*/
}
}
因此在放入数据时,需要利用put的方法放入map中,而又因为springcloud在调用其他服务后返回结果会转换为LinkedHashMap(前提是,如果map中的value为复杂对象,例如为List。这里不是很清楚,懂得人可以解答下),所以先将LinkedHashMap转换为json字符串,然后再转换为自己想要的类型对象
public class R extends HashMap<String, Object> {
private static final long serialVersionUID = 1L;
public <T> T getData(TypeReference<T> typeReference){
Object data = get("data");
String s = JSON.toJSONString(data);
T t = JSON.parseObject(s, typeReference);
return t;
}
public R setData(Object data){
put("data",data);
return this;
}