【问题标题】:Moshi Retrofit2 Kotlin Class Not Found ExceptionMoshi Retrofit2 Kotlin 类未找到异常
【发布时间】:2018-11-27 17:50:47
【问题描述】:

我正在尝试学习如何在 Kotlin 编程语言中实现 Retrofit2 和 Moshi。但是,我似乎在尝试编译我的代码时遇到了麻烦。

我定义了以下数据类/模型,这些数据类/模型映射到我从正在点击的 api 收到的 json 响应:

@JsonClass(generateAdapter = true)
data class Catalogs(
        val languages: List<LanguageCatalog>
)

@JsonClass(generateAdapter = true)
data class LanguageCatalog(
    val direction: String,
    val identifier: String,
    val title: String,
    val resources: List<ResourceCatalog>
)

@JsonClass(generateAdapter = true)
data class Project(
        val identifier: String,
        val sort: Int,
        val title: String,
        val versification: String?
)

@JsonClass(generateAdapter = true)
data class ResourceCatalog(
        val identifier: String,
        val modified: String,
        val projects: List<Project>,
        val title: String,
        val version: String
)

然后我有一个定义 API 行为的接口:

interface Door43Service
{
    @GET("v3/catalog.json")
    fun getFormat() : Observable<Catalogs>

    companion object
    {
        fun create(): Door43Service
        {
            val retrofit = Retrofit.Builder()
                    .addCallAdapterFactory(
                            RxJava2CallAdapterFactory.create()
                    )
                    .addConverterFactory(
                            MoshiConverterFactory.create()
                    )
                    .baseUrl("https://api.door32.org/")
                    .build()
            return retrofit.create(Door43Service::class.java)
        }
    }
}

最后,我在一个 main 函数中实现了一切,以从 api 获取 json 数据:

val door43Service by lazy {
    Door43Service.create()
}

var disposable: Disposable? = null

fun main(args: Array<String>)
{
    door43Service.getFormat()
           .subscribe(
                   { result -> println(result.languages)},
                   { error -> println(error.message)}
           )
}

从api返回的数据很长,但是可以在http://api-info.readthedocs.io/en/latest/door43.html找到一个例子

我的问题是我的堆栈中出现以下错误:

Exception in thread "main" java.lang.IllegalArgumentException: Unable to create converter for class model.Catalogs
    for method Door43Service.getFormat
    at retrofit2.ServiceMethod$Builder.methodError(ServiceMethod.java:755)
    at retrofit2.ServiceMethod$Builder.createResponseConverter(ServiceMethod.java:741)
    at retrofit2.ServiceMethod$Builder.build(ServiceMethod.java:172)
    at retrofit2.Retrofit.loadServiceMethod(Retrofit.java:170)
    at retrofit2.Retrofit$1.invoke(Retrofit.java:147)
    at com.sun.proxy.$Proxy0.getFormat(Unknown Source)
    at MainKt.main(main.kt:11)
Caused by: java.lang.RuntimeException: Failed to find the generated JsonAdapter class for class model.Catalogs
    at com.squareup.moshi.StandardJsonAdapters.generatedAdapter(StandardJsonAdapters.java:249)
    at com.squareup.moshi.StandardJsonAdapters$1.create(StandardJsonAdapters.java:62)
    at com.squareup.moshi.Moshi.adapter(Moshi.java:130)
    at retrofit2.converter.moshi.MoshiConverterFactory.responseBodyConverter(MoshiConverterFactory.java:91)
    at retrofit2.Retrofit.nextResponseBodyConverter(Retrofit.java:330)
    at retrofit2.Retrofit.responseBodyConverter(Retrofit.java:313)
    at retrofit2.ServiceMethod$Builder.createResponseConverter(ServiceMethod.java:739)
    ... 5 more
Caused by: java.lang.ClassNotFoundException: model.CatalogsJsonAdapter
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at com.squareup.moshi.StandardJsonAdapters.generatedAdapter(StandardJsonAdapters.java:236)

乍一看,我的理解是编译器认为我没有为我的 Catalogs 类定义适配器,但我认为应该使用 @JsonClass(generateradapter = true) 注释来覆盖。有什么我想念的吗?为什么我的程序不能为我的 Catalogs 类生成适配器?

【问题讨论】:

    标签: kotlin retrofit2 moshi


    【解决方案1】:

    所以我得到了工作。我所要做的就是通过在终端中运行 gradle build 来重建项目(我最初是在 IntelliJ 中运行它,但这似乎并没有真正运行构建)。关键问题是由于构建没有运行,我的 gradle 构建脚本中的行说,

    kapt "com.squareup.moshi:moshi-kotlin-codegen:$moshi_version"
    

    没有运行。这一行基本上让编译器能够理解代码中的注释,如@JsonClass。没有这一行,编译器将无法理解注解。这是我的问题的根本原因。我会保留这篇文章,以防有人遇到同样的问题。

    【讨论】:

    • 仅供参考,如果您希望 IntelliJ 将构建委托给 gradle,您可以查看here
    • 太棒了。感谢@user2340612 的提示。希望以后能减轻一些头痛。
    • 适配器是在哪个目录生成的?
    • 未来读者:我有一个多模块项目,并且在核心模块 (A) 中定义了 kapt 依赖项。为了使 codegen 正常工作,需要在具有模型类的模块 (B) 中定义 kapt。尽管模块 B 对模块 A 有依赖关系,但直到我在 B 中显式添加 codegen 依赖项后它才起作用。
    猜你喜欢
    • 2020-04-18
    • 1970-01-01
    • 2022-01-22
    • 2013-04-09
    • 2016-09-13
    • 2016-10-01
    • 2015-08-01
    相关资源
    最近更新 更多