每当我从JSON看起来像{"rights":[{"name":"stock_management","right":true}]}
的服务器得到响应时,我的改进使用类SimpleResponse<T>
将其转换为我想要的响应,但相反,我得到的是作为权限值的空列表。
data class SimpleResponse<T>(
val data: T? = null,
val error: String? = null,
val rights: List<LMSPermission> = emptyList()
)
@Entity
data class LMSPermission(
@PrimaryKey(autoGenerate = false)
val name: Permission,
val right: Boolean = false
) {
enum class Permission(val lmsName: String) {
@SerializedName("stock_management")
STOCK_PERMISSION("stock_management")
}
}
我试着创建gson示例并从中生成类,但是一切都很好,所以我试着在我的改型示例中添加拦截器,然后我试着从response中获取类示例,结果成功了。
@Provides
@Singleton
fun provideRetrofitDAO(): RetrofitDao {
val gson = GsonBuilder()
.registerTypeAdapter(Event::class.java, EventDeserializer())
val logging = HttpLoggingInterceptor()
.setLevel(HttpLoggingInterceptor.Level.BODY)
val httpClient = OkHttpClient.Builder()
.connectTimeout(30, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS)
.addInterceptor(logging)
.addInterceptor { chain ->
val response = chain.proceed(chain.request().newBuilder().build())
Log.d(TAG, "provideRetrofitDAO: $response")
response.let {
if (it.code == 200)
Log.d(TAG, "provideRetrofitDAO: ${gson.create().fromJson<SimpleResponse<Any>>(it.body.string(), TypeToken.getParameterized(SimpleResponse::class.java, Any::class.java).type)}")
}
response
}
val retrofitBuilder =
Retrofit
.Builder()
.baseUrl(if (MainActivity.debug) API_BASE_URL_DEBUG else API_BASE_URL)
.addConverterFactory(
GsonConverterFactory.create(gson.create())
)
.callbackExecutor(Executors.newSingleThreadExecutor())
val retrofit =
retrofitBuilder
.client(
httpClient.build()
)
.build()
return retrofit.create(RetrofitDao::class.java)
}
在这一点上,我很肯定,转换器工厂是在故障,但我不知道如何修复,也不知道如何检查,如果它真的是一个问题。
1条答案
按热度按时间vyswwuz21#
看起来我写了自己的GsonConverterFactory,在那里我使用
fromJson
方法而不是getAdapter
的适配器是答案。不要问我为什么这样做,但这里是代码,MyTypeAdapter
没有真正实现,因为我把它用作Type
变量的容器。