gpt4 book ai didi

android - 使用 Retrofit、Moshi 和 Kotlin 解开封装的响应

转载 作者:行者123 更新时间:2023-12-02 10:43:19 28 4
gpt4 key购买 nike

我正在使用一个返回如下响应的 API:

{
"irrelevantStuff": {},
"data": []
}

我想遵循 this presentation from Jake 中演示的方法,他在其中创建了一个 Retrofit 转换器工厂来处理和展开信封类型。唯一的问题是所示的方法使用 Gson 和 Java,而我正在尝试使用 Moshi 和 Kotlin。

我已将我的信封类型声明为:

data class Envelope<T>(val data: T)

任何我的转换器工厂为:

object EnvelopeConverter : Converter.Factory() {

override fun responseBodyConverter(
type: Type,
annotations: Array<Annotation>,
retrofit: Retrofit
): Converter<ResponseBody, *>? {

val envelopedType = Types.newParameterizedType(Envelope::class.java, type)
val delegate: Converter<ResponseBody, Envelope<Any>>? =
retrofit.nextResponseBodyConverter(this, envelopedType, annotations)

return Unwrapper(delegate)
}

private class Unwrapper<T>(
private val delegate: Converter<ResponseBody, Envelope<T>>?
) : Converter<ResponseBody, T> {

override fun convert(value: ResponseBody): T? {
return delegate?.convert(value)?.data
}
}
}

改造已配置为:

val retrofit: Retrofit = Retrofit.Builder()
.baseUrl(currentEndpoint.url)
.addConverterFactory(EnvelopeConverter)
.addConverterFactory(MoshiConverterFactory.create(Moshi.Builder().add(KotlinJsonAdapterFactory()).build()))
.build()

但是,当执行请求时,我收到如下所示的异常。值得注意的是,这个转换器在使用 moshi-kotlin-codegen 依赖项时工作正常。这只是基于 moshi-kotlin 反射的库存在问题。这是什么原因?

java.lang.AssertionError: Built-in class kotlin.Any is not found
at kotlin.reflect.jvm.internal.impl.builtins.KotlinBuiltIns$3.invoke(KotlinBuiltIns.java:113)
at kotlin.reflect.jvm.internal.impl.builtins.KotlinBuiltIns$3.invoke(KotlinBuiltIns.java:108)
at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$MapBasedMemoizedFunction.invoke(LockBasedStorageManager.java:440)
at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$MapBasedMemoizedFunctionToNotNull.invoke(LockBasedStorageManager.java:515)
at kotlin.reflect.jvm.internal.impl.builtins.KotlinBuiltIns.getBuiltInClassByName(KotlinBuiltIns.java:362)
at kotlin.reflect.jvm.internal.impl.builtins.KotlinBuiltIns.getAny(KotlinBuiltIns.java:367)
at kotlin.reflect.jvm.internal.impl.builtins.KotlinBuiltIns.getAnyType(KotlinBuiltIns.java:642)
at kotlin.reflect.jvm.internal.impl.builtins.KotlinBuiltIns.getNullableAnyType(KotlinBuiltIns.java:647)
at kotlin.reflect.jvm.internal.impl.builtins.KotlinBuiltIns.getDefaultBound(KotlinBuiltIns.java:652)
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedTypeParameterDescriptor.resolveUpperBounds(DeserializedTypeParameterDescriptor.kt:45)
at kotlin.reflect.jvm.internal.impl.descriptors.impl.AbstractTypeParameterDescriptor$TypeParameterTypeConstructor.computeSupertypes(AbstractTypeParameterDescriptor.java:154)
at kotlin.reflect.jvm.internal.impl.types.AbstractTypeConstructor$supertypes$1.invoke(AbstractTypeConstructor.kt:34)
at kotlin.reflect.jvm.internal.impl.types.AbstractTypeConstructor$supertypes$1.invoke(AbstractTypeConstructor.kt:22)
at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$LockBasedLazyValue.invoke(LockBasedStorageManager.java:346)
at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$LockBasedNotNullLazyValue.invoke(LockBasedStorageManager.java:402)
at kotlin.reflect.jvm.internal.impl.types.AbstractTypeConstructor.getSupertypes(AbstractTypeConstructor.kt:23)
at kotlin.reflect.jvm.internal.impl.descriptors.impl.AbstractTypeParameterDescriptor.getUpperBounds(AbstractTypeParameterDescriptor.java:116)
at kotlin.reflect.jvm.internal.impl.types.typeUtil.TypeUtilsKt.getRepresentativeUpperBound(TypeUtils.kt:237)
at kotlin.reflect.jvm.internal.impl.resolve.jvm.InlineClassManglingRulesKt.isTypeParameterWithUpperBoundThatRequiresMangling(inlineClassManglingRules.kt:44)
at kotlin.reflect.jvm.internal.impl.resolve.jvm.InlineClassManglingRulesKt.requiresFunctionNameMangling(inlineClassManglingRules.kt:37)
at kotlin.reflect.jvm.internal.impl.resolve.jvm.InlineClassManglingRulesKt.shouldHideConstructorDueToInlineClassTypeValueParameters(inlineClassManglingRules.kt:23)
at kotlin.reflect.jvm.internal.KFunctionImpl.createConstructorCaller(KFunctionImpl.kt:145)
at kotlin.reflect.jvm.internal.KFunctionImpl.access$createConstructorCaller(KFunctionImpl.kt:36)
at kotlin.reflect.jvm.internal.KFunctionImpl$caller$2.invoke(KFunctionImpl.kt:80)
at kotlin.reflect.jvm.internal.KFunctionImpl$caller$2.invoke(KFunctionImpl.kt:36)
at kotlin.reflect.jvm.internal.ReflectProperties$LazyVal.invoke(ReflectProperties.java:62)
at kotlin.reflect.jvm.internal.ReflectProperties$Val.getValue(ReflectProperties.java:31)
at kotlin.reflect.jvm.internal.KFunctionImpl.getCaller(Unknown Source:7)
at kotlin.reflect.jvm.ReflectJvmMapping.getJavaMethod(ReflectJvmMapping.kt:62)
at kotlin.reflect.jvm.KCallablesJvm.setAccessible(KCallablesJvm.kt:82)
at com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory.create(KotlinJsonAdapter.kt:221)
at com.squareup.moshi.Moshi.adapter(Moshi.java:138)
at com.squareup.moshi.Moshi.adapter(Moshi.java:98)
at retrofit2.converter.moshi.MoshiConverterFactory.responseBodyConverter(MoshiConverterFactory.java:91)
at retrofit2.Retrofit.nextResponseBodyConverter(Retrofit.java:352)
E/AndroidRuntime: at codes.chrishorner.socketweather.data.EnvelopeConverter.responseBodyConverter(EnvelopeConverter.kt:19)
at retrofit2.Retrofit.nextResponseBodyConverter(Retrofit.java:352)
at retrofit2.Retrofit.responseBodyConverter(Retrofit.java:335)
at retrofit2.HttpServiceMethod.createResponseConverter(HttpServiceMethod.java:113)
at retrofit2.HttpServiceMethod.parseAnnotations(HttpServiceMethod.java:82)
at retrofit2.ServiceMethod.parseAnnotations(ServiceMethod.java:37)
at retrofit2.Retrofit.loadServiceMethod(Retrofit.java:192)
at retrofit2.Retrofit$1.invoke(Retrofit.java:149)
at java.lang.reflect.Proxy.invoke(Proxy.java:1006)
at $Proxy1.searchForLocation(Unknown Source)
at codes.chrishorner.socketweather.MainActivity$onStart$1.invokeSuspend(MainActivity.kt:46)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:56)
at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:561)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:727)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:667)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:655)

最佳答案

事实证明,我因一些过度热心的优化中的复制粘贴而受到诅咒!

在我的应用程序模块的 build.gradle 文件中,我包含了:

packagingOptions {
exclude 'kotlin/**'
exclude '**/*.kotlin_metadata'
exclude 'META-INF/*.kotlin_module'
exclude 'META-INF/*.version'
}

排除“kotlin/**”是罪魁祸首。

这个故事的寓意:复制和粘贴时要小心!

关于android - 使用 Retrofit、Moshi 和 Kotlin 解开封装的响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59440872/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com