Kotlin SpringBoot中KSP生成的Moshi适配器未与Retrofit配合使用问题
问题排查与解决方案
1. 优先检查GeocodeResponse的配置
报错直接指向GeocodeResponse无法生成转换器,你提供的代码仅覆盖了请求DTO,需确认:
- 若
GeocodeResponse是你可控的类:是否添加了@JsonClass(generateAdapter = true)注解,且KSP已为其生成对应的适配器类(可在build/generated/ksp/main/kotlin目录下查找)。 - 若
GeocodeResponse是外部无控制权的POJO:- 若是Kotlin类,需添加
kotlin-reflect依赖:implementation("org.jetbrains.kotlin:kotlin-reflect:${project.ext.kotlinVersion}") - 若是Java类,需在Moshi构建时添加
JavaJsonAdapterFactory。
- 若是Kotlin类,需添加
2. 修正Moshi实例配置,确保加载代码生成适配器
默认的MoshiConverterFactory.create()不会自动加载KSP生成的适配器,需手动构建包含Kotlin支持和服务加载的Moshi实例:
internal object GeocoderProvider { @VisibleForTesting var mockApi: Geocoder? = null fun get(): Geocoder { val moshi = Moshi.Builder() // 支持Kotlin数据类的代码生成适配器与反射适配器 .add(KotlinJsonAdapterFactory()) .build() return mockApi ?: Retrofit.Builder() .baseUrl(GeoProperties.baseUrl) .client(OkHttpClient.Builder().build()) // 使用自定义Moshi实例而非默认实现 .addConverterFactory(MoshiConverterFactory.create(moshi)) .build() .create(Geocoder::class.java) } }
KSP生成的适配器会通过ServiceLoader自动注册到Moshi实例,只要生成的代码在类路径中,上述配置即可识别到。
3. 验证KSP与Kotlin版本兼容性
你使用的KSP版本2.1.0-1.0.29需与项目Kotlin版本严格匹配(KSP版本命名规则为[Kotlin版本]-[KSP核心版本])。若项目Kotlin版本与2.1.0不符,会导致生成的适配器类不兼容,无法被Moshi识别:
- 检查项目根目录
build.gradle/settings.gradle中的Kotlin版本,调整KSP版本至对应匹配版本。 - 执行
./gradlew clean kspKotlin清理缓存并重生成适配器代码,确认build/generated/ksp目录下存在对应适配器类。
4. 外部POJO的反射支持补充
对于无控制权的外部POJO,需确保Moshi启用对应反射支持:
- Kotlin外部类:依赖
kotlin-reflect+ 配置KotlinJsonAdapterFactory - Java外部类:在Moshi构建时添加
JavaJsonAdapterFactory:val moshi = Moshi.Builder() .add(KotlinJsonAdapterFactory()) .add(JavaJsonAdapterFactory()) .build()
5. 调试适配器加载
可添加日志确认Moshi是否加载了KSP生成的适配器:
val moshi = Moshi.Builder() .add(KotlinJsonAdapterFactory()) .build() moshi.adapters.forEach { println("Loaded adapter factory: $it") }
若未看到KSP生成的适配器工厂,需检查:
- KSP任务是否执行成功(查看Gradle任务日志)
- 生成的
META-INF/services/com.squareup.moshi.JsonAdapter.Factory文件是否包含适配器类的全限定名
内容的提问来源于stack exchange,提问作者arkascha
相关产品推荐
相关产品推荐

