Java Gson ClassCastException - PullRequest
       9

Java Gson ClassCastException

0 голосов
/ 28 мая 2019

Я создаю 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 других классов, которые работают так же, и они отлично сериализуются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...