有个需求,须要在JavaBean里面嵌入一个List<Bean>,包含泛型。但在转换以后,调用List的数据就开始抛异常了。下面是Bean的示例代码:java
public class Bean1 { public String name; public List<Bean2> beanList; }
public class Bean2 { public Integer id; }
相对应的json数据json
[ { "name": "hello", "beanList": [ { "id": 1, updateTime: null}, { "id": 2, updateTime: null} ] }, { "name": "hello2", "beanList": [ { "id": 3, updateTime: null}, { "id": 4, updateTime: null} ] } ]
play框架引入了javassist工具,用来产生字节码加强,可是在生成代码的时候丢失了泛型,使得beanList从List<Bean2> beanList
变成了List beanList
。Fastjson在反序列化的时候,须要泛型才能得出Bean2
类型,因此转换的时候出错,致使变成了JSONObject
的原始类型。框架
出错代码:com.alibaba.fastjson.util.FieldInfo.java:106
函数
public class Bean1 { public String name; public List<Bean2> beanList; //添加setter public void setBeanList(List<Bean2> beanList){ this.beanList = beanList; } }
虽然javassist在加强代码的时候会丢失字段的泛型,可是不会丢失函数参数的泛型,因此利用这点能够让fastjson找回泛型类型。工具
在playframework以及一些拥有代码加强的框架里面,须要特别注意fastjson等这些依赖泛型反射的框架。this