Android 使用改装、Moshi和Kotlin展开包络响应

Android 使用改装、Moshi和Kotlin展开包络响应,android,kotlin,retrofit,retrofit2,moshi,Android,Kotlin,Retrofit,Retrofit2,Moshi,我使用的API返回的响应如下所示: { "irrelevantStuff": {}, "data": [] } 我想遵循中演示的方法,他创建了一个改装转换器工厂来处理和打开信封类型。唯一的问题是,所示的方法使用Gson和Java,而我正试图使用Moshi和Kotlin 我已将我的信封类型声明为: data class Envelope<T>(val data: T) 但是,当执行请求时,我收到如下所示的异常。值得注意的是,当使用moshi kotlin codegen依

我使用的API返回的响应如下所示:

{
  "irrelevantStuff": {},
  "data": [] 
}
我想遵循中演示的方法,他创建了一个改装转换器工厂来处理和打开信封类型。唯一的问题是,所示的方法使用Gson和Java,而我正试图使用Moshi和Kotlin

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

data class Envelope<T>(val data: T)
但是,当执行请求时,我收到如下所示的异常。值得注意的是,当使用
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/**”
是罪魁祸首


这个故事的寓意是:复制和粘贴的东西要小心

项目中是否包含stdlib?是的<代码>实现“org.jetbrains.kotlin:kotlin-stdlib-jdk8:${versions.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)
packagingOptions {
  exclude 'kotlin/**'
  exclude '**/*.kotlin_metadata'
  exclude 'META-INF/*.kotlin_module'
  exclude 'META-INF/*.version'
}