无法为类...,Retrofit2,Realm4和GSON创建转换器

时间:2017-10-31 23:03:13

标签: android gson realm retrofit retrofit2

这不是一个问题。它解释了获得此例外的另一种方式 所以我使用Retrofit 2并且它已经正确设置:

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中有这个Retrofit配置:

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

Realm 4.1.1:

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

和我的项目中的GSON。

但是我得到例外:

java.lang.IllegalArgumentException: Unable to create converter for class<br> 
在请求发生之前,来自ApiHelper的

说明
这个例外并不是关于Retrofit(但大多数答案都是关于Retrofit配置)。它关于境界。从版本4.0开始,他们增加了对原始RealmList的支持。我的响应类包含以下字段:

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

实际上这就是异常的原因! Realm docs说

  

基元列表不支持列表列表,查询和导入   使用Realm.create * FromJson API。

但这对我来说不太明显。因此,如果你得到这样的异常并且你已经设置了所有东西(我的意思是Retrofit / GSON / gradle.build),很可能是因为如果你正在使用原语列表。它们受到支持,但反序列化却没有。

1 个答案:

答案 0 :(得分:1)

限制适用于createObjectFromJson()createAllFromJson()方法,它与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();