我正在构建Java Servlets 3.0 REST API,并使用Gson将一些数据序列化为json。
不过,我收到此错误:
java.lang.ClassCastException: za.co.a.models.tables.sybase.Family cannot be cast to java.util.Map
at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:145)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:97)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:61)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:127)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:245)
at com.google.gson.Gson.toJson(Gson.java:704)
at com.google.gson.Gson.toJson(Gson.java:683)
at com.google.gson.Gson.toJson(Gson.java:638)
at com.google.gson.Gson.toJson(Gson.java:618)
at za.co.a.helpers.JsonHelper.toJson(JsonHelper.java:33)
at za.co.a.models.tables.sybase.ActiveProcesses.saveProcess(ActiveProcesses.java:57)
我的代码如下:
@Table(name = "E_FAMILY")
public class Family extends IGenericModel <Family>
{
@Id
public BigDecimal EMPLOYEE_ID;
@Id
public BigDecimal FAMILY_ID;
@Id
public BigDecimal COMPANY_ID;
public String FIRSTNAME;
public String SECONDNAME;
public String SURNAME;
public String RELATION;
public int RELATION_ID;
public String MED_DEPENDENT_YN;
public String TAX_DEPENDENT_YN;
public String GENDER;
public Date BIRTHDATE;
public String TEL_HOME;
public String TEL_WORK;
public String TEL_CELL;
public String E_MAIL;
...
}
呼叫代码:
public String toJson(Object obj)
{
return gson.toJson(obj);
}
在这种情况下,家庭是较大类中的字段,但是,对于其他任何字段或类似的其他类,我都没有任何问题。这是我在进行此开发的那一年中第一次出现此错误。 Gson可以序列化的类的大小或复杂性是否受到限制?还是我可以检查一下导致错误的原因?还是有办法更改此特定的映射(尽管我不明白为什么Google试图将此类映射到Map)?
谢谢 塞思莫
编辑,包括课程层次结构
IGenericModel和IGenericReadOnlyModel仅包含函数。 IModel有2个成员,但我已将其添加为ExclusionStrategy的一部分,以使这些成员不会序列化。
public class IGenericModel<T> extends IGenericReadOnlyModel
{
}
public class IGenericReadOnlyModel<T> extends IModel
{
}
public class IModel
{
protected String dbEngine;
protected IDatabase db;
}
编辑 其余代码
好吧,拥有Family的类非常大,并且几乎充满了Strings,Dates和Booleans和int。 Family出现在这里,这两个对象是从前端传递来的,代表旧值和新值(用户可以在UI中编辑,添加和删除Family成员,然后提交这些列表)。
public abstract class IWebProcess extends IModel
{
protected Object _OldValue;
protected Object _NewValue;
}
一旦提交(作为UI中的JSON),它就会被序列化:
Type familyType = new TypeToken<LinkedList<Family>>(){}.getType();
LinkedList<Family> oldFamily = gson.fromJson(oldFamilyJson, familyType);
LinkedList<Family> newFamily = gson.fromJson(newFamilyJson, familyType);
然后,初始化具体类:
IWebProcess family = WebProcess_FamilyRequisition(oldFamily,newFamily,...,...,...)
然后,在WebProcess_FamilyRequisition的构造函数中,我调用super(oldFamily,newFamily),然后在IWebProcess的构造函数中:
this._OldValue = oldFamily
this._NewValue = newFamily
我执行所有这些强制转换,因为在将整个WebProcess序列化到DB之前,我先将新值保存到DB中。我制作了_OldValue和_NewValue对象,因为这是8个其他类的基类,它们的工作原理相同,并且它们可以很好地进行序列化。