GSON,在不同范围加载 class 时不考虑 @SerializedName

GSON, @SerializedName not taken into account when class is loaded in different scope

我在两个不同的包和两个不同的 .jars 中创建了两个完全相同的 classes。 com.test 在 Tomcat7 中全局加载(放置在 /lib/ext/ 中),而 es.package 作为 portlet 的依赖项加载。

import com.google.gson.annotations.SerializedName;
import java.io.Serializable;

public class RequestBean implements Serializable {

    @SerializedName("SOMETHING")
    private String  id;

    @SerializedName("CUENTA")
    private String  account;

    public String getAccount() {
        return account;
    }

    public void setAccount(String account) {
        this.account = account;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}

当 portlet 中有以下代码时:

com.test.RequestBean localBean = new com.test.RequestBean();
localBean.setAccount("account");
localBean.setId("100");

es.package.RequestBean globalBean = new es.package.RequestBean();
globalBean.setAccount("account");
globalBean.setId("100");

System.out.println(gson.toJson(localBean, localBean.getClass()).toString());
System.out.println(gson.toJson(globalBean, globalBean.getClass()).toString());

令我惊讶的是,结果是不同的。对于 globalBean,不考虑 @SerializedName。可能是什么原因?全局 class 在全局范围内可用,本地范围仅在 portlet 范围内可用。

{"SOMETHING":"100","CUENTA":"account"} 
{"id":"100","account":"account"}

原因是在 portlet 范围内加载了 gson-2.2.0,在全局范围内加载了 gson-3.2.1。只留下全局的解决了这个问题。