这不是一个问题。它解释了获得此例外的另一种方式 所以我使用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),很可能是因为如果你正在使用原语列表。它们受到支持,但反序列化却没有。
答案 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();