You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 15:49:55