2017-10-31 12 views
0

それは質問ではありません。この例外を取得する別の方法の説明。
だから私は改修2使用して、それが正しく設定されていた:クラス...、Retrofit2、Realm4およびGSONのコンバーターを作成できません

retrofit = new Retrofit.Builder() 
     .baseUrl(BASE_URL) 
     .client(okHttpClient) 
     .addConverterFactory(GsonConverterFactory.create(gson)) 
     .build(); 

レルム4.1.1:

dependencies { 
    classpath "io.realm:realm-gradle-plugin:4.1.1" 
} 

compile 'com.squareup.retrofit2:retrofit:2.3.0' 
compile "com.squareup.retrofit2:converter-scalars:2.3.0" 
compile 'com.squareup.retrofit2:converter-gson:2.3.0' 

私はApiHelperで、このレトロフィットの設定を持っていますと私のプロジェクトではGSON。

しかし、私は例外を取得しています:ApiHelperから

java.lang.IllegalArgumentException: Unable to create converter for class<br> 

要求が起こる直前に。

説明:
この例外は実際に改修に関するものではありません(ただし、ほとんどの答えはレトロフィットの構成に関するものです)。その領域について。バージョン4.0以降、プリミティブのRealmListのサポートが追加されました。私の応答クラスには次のようなフィールドが含まれています:

@SerializedName("bad_habits") 
private RealmList<Integer> badHabitIds; 

実際にこれが例外の理由です!レルムのドキュメントは、プリミティブの

リストは、リスト・オブ・リストをサポート照会しRealm.create * FromJson APIのを使用して をインポートしていないと言います。

しかし、それは私には不明瞭です。だから、もしあなたがそのような例外を得て、あなたがそれを使用しているなら、あなたはプリミティブのリストのせいですべてをセットアップしています(Retrofit/GSON/gradle.buildという意味です)。それらはサポートされていますが、その逆シリアル化はサポートされていません。

答えて

1

制限はcreateObjectFromJson()との方法であり、GSONがどのように(またはこの場合は)非直列化​​を試みるかとは関係ありません。

ほとんどの場合、GSONインスタンス用のタイプアダプタを定義することができますが、問題が修正されます。

Gson gson = new GsonBuilder() 
    .setExclusionStrategies(new ExclusionStrategy() { 
     @Override 
     public boolean shouldSkipField(FieldAttributes f) { 
      return f.getDeclaringClass().equals(RealmObject.class); // is this still needed? 
     } 

     @Override 
     public boolean shouldSkipClass(Class<?> clazz) { 
      return false; 
     } 
    }) 
    .registerTypeAdapter(new TypeToken<RealmList<Integer>>() {}.getType(), new TypeAdapter<RealmList<Integer>>() { 

     @Override 
     public void write(JsonWriter out, RealmList<Integer> value) throws IOException { 
      // Ignore for now 
     } 

     @Override 
     public RealmList<Integer> read(JsonReader in) throws IOException { 
      RealmList<Integer> list = new RealmList<Integer>(); 
      in.beginArray(); 
      while (in.hasNext()) { 
       list.add(in.nextInt()); 
      } 
      in.endArray(); 
      return list; 
     } 
    }) 
    .create(); 
+0

私が行ったのとまったく同じです。 RealmList についても。面白いことに、公式の医師はこのアプローチを文書化していない。 – Stan

関連する問題