Я создаю REST API Java Servlets 3.0 и использую 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 пытается сопоставить этот класс с картой)?
Спасибо Sethmo
Редактировать Включая иерархию классов
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;
}
Edit остальныекод
Хорошо, класс с семейством достаточно большой и в основном содержит строки, даты, логические значения и целые числа.Сюда входит Family, два объекта передаются из внешнего интерфейса и представляют старые и новые значения (пользователи могут редактировать, добавлять и удалять членов семьи в пользовательском интерфейсе, а затем отправлять эти списки).
public abstract class IWebProcess extends IModel
{
protected Object _OldValue;
protected Object _NewValue;
}
После отправки (как 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
Я делаю все это приведение, потому что сначала я сохраняю новые значения в БД, прежде чем сериализовать весь Web-процесс в БД,Я сделал _OldValue и _NewValue Objects, потому что это базовый класс для 8 других классов, которые работают так же, и они отлично сериализуются.