2016-02-12 5 views
1

Я использую retrofit2 в сочетании с Gson, чтобы потреблять точку останова API. У меня есть CarOption модель:Gson stackOverflown при десериализации Android Retrofit

public class CarOption { 

private String    name; 
private String    label; 
private boolean    isActive; 
private String    type; 
private Integer    onglet; 
private Integer    position; 
private List<CarOptionData> data; 
private View    view; 

и модель CARFORM:

public class CarForm { 

// DEBUG 
private static final String TAG = CarForm.class.getName(); 

private ArrayList<CarOption>  fields = new ArrayList<>(); 
private static CarOptionComparator coc = new CarOptionComparator(); 

private static ArrayList<CarOption> tab0 = null; 
private static ArrayList<CarOption> tab1 = null; 
private static ArrayList<CarOption> tab2 = null; 
private static ArrayList<CarOption> tab3 = null; 

public static void downloadCarForm(final Context context, final IRequestResponseListener cb) { 
    Retrofit retrofit = RetrofitSingleton.getInstance(); 

    IWebServiceApi apiService = retrofit.create(IWebServiceApi.class); 
    Call<CarForm> call = apiService.getCarForm(User.getAccessToken()); 
    call.enqueue(new Callback<CarForm>() { 
     @Override 
     public void onResponse(Response<CarForm> response, Retrofit retrofit) { 
      int statusCode = response.code(); 
      if (statusCode == 200 || statusCode == 201) { 
       CarForm carForm = response.body(); // STACKOVERFLOWN ERROR FROM GSON 
       carForm.unCrashOnglet(carForm.fields); 
       Collections.sort(carForm.fields, coc); 
       CarForm.setTab0(createTab(context, carForm.getFields(), 0)); 
       CarForm.setTab1(createTab(context, carForm.getFields(), 1)); 
       CarForm.setTab2(createTab(context, carForm.getFields(), 2)); 
       CarForm.setTab3(createTab(context, carForm.getFields(), 3)); 
       if (cb != null) 
        cb.onSuccess(); 

У меня есть ошибка stackoverflown когда Gson пытается десериализации моего объекта. Я читал о возможной ошибке, вызванной ссылкой на родительский объект, но у меня его нет. Невозможно увидеть, откуда исходит ошибка. Он может быть связан с атрибутами атрибута «tab» array, поскольку он работал до того, как я их создал.

Вот ошибка:

W/System.err:  at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:334) 
W/System.err:  at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383) 
W/System.err:  at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378) 
W/System.err:  at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383) 
W/System.err:  at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378) 
W/System.err:  at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383) 
W/System.err:  at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378) 
W/System.err:  at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383) 
W/System.err:  at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378) 
W/System.err:  at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383) 
W/System.err:  at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378) 
W/System.err:  at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383) 
W/System.err:  at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378) 
W/System.err:  at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383) 
W/System.err:  at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378) 
W/System.err:  at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383) 
W/System.err:  at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378) 
W/System.err:  at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383) 
W/System.err:  at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378) 
W/System.err:  at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383) 
W/System.err:  at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:378) 
W/System.err:  at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:383) 
W/System.err:  at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:358) 
W/System.err:  at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:155) 
W/System.err:  at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:97) 
W/System.err:  at com.google.gson.Gson.getAdapter(Gson.java:407) 
W/System.err:  at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getFieldAdapter(ReflectiveTypeAdapterFactory.java:136) 
W/System.err:  at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.access$100(ReflectiveTypeAdapterFactory.java:49) 
W/System.err:  at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:106) 
W/System.err:  at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:105) 
W/System.err:  at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:161) 
W/System.err:  at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:97) 
W/System.err:  at com.google.gson.Gson.getAdapter(Gson.java:407) 
W/System.err:  at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getFieldAdapter(ReflectiveTypeAdapterFactory.java:136) 
W/System.err:  at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.access$100(ReflectiveTypeAdapterFactory.java:49) 
W/System.err:  at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:106) 
W/System.err:  at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:105) 
W/System.err:  at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:161) 
W/System.err:  at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:97) 
W/System.err:  at com.google.gson.Gson.getAdapter(Gson.java:407) 

Есть ли у вас какие-либо идеи по этому вопросу?

Заранее благодарен.

+0

Возможно, вы захотите переместить 'private List данные;' в 'CarForm' – Blackbelt

+0

Я думаю, что у вас есть круговая зависимость в ваших моделях. Круговая зависимость - это когда у вас есть 'A', ссылающийся на' B', который снова ссылается на 'A'. Было бы более полезно, если бы вы опубликовали все классы моделей, связанные с «CarForm» –

+0

Что представляет собой класс вида в этом контексте? –

ответ

1

Как сказано в комментариях:

public class CarOption { 
... 
private View    view; 

стали:

public class CarOption { 
... 
private Object    view; 

который решить мою проблему. Затем я возвращаю его обратно в «Вид», когда мне нужно получить к нему доступ.

+0

Я действительно не знаю, почему так, если кто-то может дать объяснение. Возможно, класс View имеет циклическую зависимость, которая вызывает это переполнение. – valvince

+0

Странно ... Спасибо, я думал, что потерял сознание после нескольких часов отладки. – cuddlecheek

Смежные вопросы