解決Fastjson在PlayFramework下面出現JSONObject can not cast to XXXX的問題

環境

  • Fastjson 1.2.34
  • Play 1.4.4

背景

有個需求,須要在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

相關文章
相關標籤/搜索