首页 > 解决方案 > 如何从 Micronaut 应用程序的库中注入 HTTP 客户端?

问题描述

我有一个到其他服务的外部 http 客户端,我已经将它导入到我的 micronaut 应用程序,但收到一个错误,指出:

原因:io.micronaut.context.exceptions.NoSuchBeanException:不存在 [xxx.files.client.micronaut.FilesClient] 类型的 bean。确保 bean 没有被 bean 要求禁用(启用跟踪日志以检查“io.micronaut.context.condition”),如果启用了 bean,则确保将类声明为 bean 并启用注释处理(对于 Java 和Kotlin 的“micronaut-inject-java”依赖项应配置为注解处理器)。

我在应用程序启动时添加了这些类:

object TransformerApplication {
    @JvmStatic
    fun main(args: Array<String>) {
        Micronaut.build()
                .packages(
                        "xxx.transformer",
                        "xxx.files.client.micronaut"
                )
                .mainClass(TransformerApplication.javaClass)
                .start()
    }
}

但是在创建时:

@KafkaListener("transformer-group")
class EventsConsumerImpl(private val xlsTransformer: XlsTransformer,
                         private val filesClient: FilesClient,
                         private val workspacesClient: WorkspacesClient) : EventsConsumer {
    ...
    }

我的http客户端:

@io.micronaut.http.client.annotation.Client("\${files.url}")
interface FilesClient {

    companion object {
        const val FILES_TOKEN_KEY = "FILES"
    }

    @FilesTokenVerification
    @Get("\${files.url}/{fileId}")
    fun getFile(@PathVariable fileId: String): ByteArray

    @FilesTokenVerification
    @Patch("\${files.url}/{fileId}/info")
    fun updateFileStatus(@PathVariable fileId: String, @Body metadata: Metadata): Metadata

    @FilesTokenVerification
    @Get("\${files.url}/{fileId}/info")
    fun getFileMetadata(@PathVariable fileId: String): Metadata
}```

Can someone explain to me what I'm doing wrong?

标签: kotlinmicronautmicronaut-client

解决方案


通常会为此使用工厂:

https://docs.micronaut.io/latest/guide/index.html#factories

但我不知道这是否适用于声明性客户。也许尝试一个包装。


推荐阅读