Retrofit的Gson轉換器請求報錯 java.lang.IllegalArgumentException: Unable to create converter for

今天Retrofit的請求突然報錯,發現異常 java.lang.IllegalArgumentException: Unable to create converter for ,異常如下。看來是創建Gson的轉換器出錯(retrofit用gson將字符串轉化爲實體對象),而且這個異常只出現在Android 6.0 ,Android 7.0,Android 8.0手機上

11:09:58.70 15854 WARN System.err 1 java.lang.IllegalArgumentException: Unable to create converter for com.xxx.common.entity.ResultEntity<java.util.List<com.tal.module_oral.entity.UserEntity>>
11:09:58.70 15854 WARN System.err 1 for method OralService.getPracticeListNew
11:09:58.70 15854 WARN System.err 1 at retrofit2.Utils.methodError(Utils.java:52)
11:09:58.70 15854 WARN System.err 1 at retrofit2.HttpServiceMethod.createResponseConverter(HttpServiceMethod.java:115)
11:09:58.70 15854 WARN System.err 1 at retrofit2.HttpServiceMethod.parseAnnotations(HttpServiceMethod.java:82)
11:09:58.70 15854 WARN System.err 1 at retrofit2.ServiceMethod.parseAnnotations(ServiceMethod.java:37)
11:09:58.70 15854 WARN System.err 1 at retrofit2.Retrofit.loadServiceMethod(Retrofit.java:170)
11:09:58.70 15854 WARN System.err 1 at retrofit2.Retrofit$1.invoke(Retrofit.java:149)
11:09:58.70 15854 WARN System.err 1 at java.lang.reflect.Proxy.invoke(Proxy.java:913)
–接口調用的方法

所以要往下找爲什麼創建出錯,發現又有異常, java.lang.SecurityException: Can not make a java.lang.reflect.Method constructor accessible ,這個是在 java.lang.reflect.AccessibleObject.setAccessible0 中拋出的,很明顯是調用反射類中的,意思是你實體類裏面如果有 Method類型的屬性,就拋出異常

11:09:58.71 15854 WARN System.err 1 Caused by: java.lang.SecurityException: Can not make a java.lang.reflect.Method constructor accessible
11:09:58.71 15854 WARN System.err 1 at java.lang.reflect.AccessibleObject.setAccessible0(AccessibleObject.java:131)
11:09:58.71 15854 WARN System.err 1 at java.lang.reflect.AccessibleObject.setAccessible(AccessibleObject.java:115)
11:09:58.71 15854 WARN System.err 1 at com.google.gson.internal.reflect.PreJava9ReflectionAccessor.makeAccessible(PreJava9ReflectionAccessor.java:31)
11:09:58.71 15854 WARN System.err 1 at com.google.gson.internal.ConstructorConstructor.newDefaultConstructor(ConstructorConstructor.java:103)
11:09:58.71 15854 WARN System.err 1 at com.google.gson.internal.ConstructorConstructor.get(ConstructorConstructor.java:85)
11:09:58.71 15854 WARN System.err 1 at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:101)
11:09:58.71 15854 WARN System.err 1 at com.google.gson.Gson.getAdapter(Gson.java:458)
11:09:58.71 15854 WARN System.err 1 at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
11:09:58.71 15854 WARN System.err 1 at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
11:09:58.71 15854 WARN System.err 1 at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
11:09:58.71 15854 WARN System.err 1 at com.google.gson.Gson.getAdapter(Gson.java:458)
11:09:58.71 15854 WARN System.err 1 at com.google.gson.internal.bind.ArrayTypeAdapter$1.create(ArrayTypeAdapter.java:48)
11:09:58.71 15854 WARN System.err 1 at com.google.gson.Gson.getAdapter(Gson.java:458)
11:09:58.71 15854 WARN System.err 1 at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
11:09:58.71 15854 WARN System.err 1 at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
11:09:58.71 15854 WARN System.err 1 at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
11:09:58.71 15854 WARN System.err 1 at com.google.gson.Gson.getAdapter(Gson.java:458)
11:09:58.71 15854 WARN System.err 1 at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
11:09:58.71 15854 WARN System.err 1 at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
11:09:58.71 15854 WARN System.err 1 at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
11:09:58.71 15854 WARN System.err 1 at com.google.gson.Gson.getAdapter(Gson.java:458)
11:09:58.71 15854 WARN System.err 1 at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
11:09:58.71 15854 WARN System.err 1 at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
11:09:58.71 15854 WARN System.err 1 at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
11:09:58.71 15854 WARN System.err 1 at com.google.gson.Gson.getAdapter(Gson.java:458)
11:09:58.71 15854 WARN System.err 1 at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
11:09:58.71 15854 WARN System.err 1 at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
11:09:58.71 15854 WARN System.err 1 at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
11:09:58.71 15854 WARN System.err 1 at com.google.gson.Gson.getAdapter(Gson.java:458)
11:09:58.71 15854 WARN System.err 1 at com.google.gson.internal.bind.CollectionTypeAdapterFactory.create(CollectionTypeAdapterFactory.java:53)
11:09:58.71 15854 WARN System.err 1 at com.google.gson.Gson.getAdapter(Gson.java:458)
11:09:58.71 15854 WARN System.err 1 at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
11:09:58.71 15854 WARN System.err 1 at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
11:09:58.71 15854 WARN System.err 1 at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
11:09:58.71 15854 WARN System.err 1 at com.google.gson.Gson.getAdapter(Gson.java:458)
11:09:58.71 15854 WARN System.err 1 at retrofit2.converter.gson.GsonConverterFactory.responseBodyConverter(GsonConverterFactory.java:64)
11:09:58.71 15854 WARN System.err 1 at retrofit2.Retrofit.nextResponseBodyConverter(Retrofit.java:330)
11:09:58.71 15854 WARN System.err 1 at retrofit2.Retrofit.responseBodyConverter(Retrofit.java:313)
11:09:58.71 15854 WARN System.err 1 at retrofit2.HttpServiceMethod.createResponseConverter(HttpServiceMethod.java:113)
11:09:58.71 15854 WARN System.err 1 … 29 more

網上查了一下,看大神的回答 https://github.com/google/gson/issues/1220

You are trying to serialize a type that has a field whose type is java.lang.reflect.Method. This either needs marked transient or you need to write a custom type adapter for it.

發現應該是你的 定義的實體類中有非法的屬性,簡單看了一下我定義的實體類
發現裏面有個View類型的屬性,是用來做本地一些操作的,然而View裏有Method 類型的屬性,所以就拋出異常了,醉了。。。後來就改了邏輯,把這個屬性去掉了,就好了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章