环境
- Fastjson 1.2.34
- Play 1.4.4
背景
有个需求,需要在JavaBean里面嵌入一个List<Bean>,包含泛型。但在转换之后,调用List的数据就开始抛异常了。下面是Bean的示例代码:
public class Bean1 {
public String name;
public List<Bean2> beanList;
}
public class Bean2 {
public Integer id;
}
相对应的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等这些依赖泛型反射的框架。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。