每个环境具有基础 url 的 Micronaut 声明式客户端

Micronaut declarative client with base url per environment

我希望能够使用 Micronaut 的声明式客户端根据我是在本地开发环境还是在生产环境中来访问不同的端点。

我在 application.dev.yml:

中设置我客户的基本 uri
myserviceclient:
  baseUri: http://localhost:1080/endpoint

阅读来自 Micronaut 的文档,他们让开发人员跳过很多环节,以获得通过管道传输到实际客户端的动态值。他们实际上很混乱。所以我创建了这样的配置:

@ConfigurationProperties(PREFIX)
class MyServiceClientConfig {

  companion object {
    const val PREFIX = "myserviceclient"
    const val BASE_URL = "http://localhost:1080/endpoint"
  }

  var baseUri: String? = null

  fun toMap(): MutableMap<String, Any> {
    val m = HashMap<String, Any>()
    if (baseUri != null) {
      m["baseUri"] = baseUri!!
    }

    return m
  }
}

但如您所见,这实际上并未从 application.yml 中读取任何值,它只是将常量值设置为 class 上的静态值。我希望 BASE_URL 值根据我所处的环境是动态的。

为了使用这个 class,我创建了一个这样的声明式客户端:

@Client(MyServiceClientConfig.BASE_URL)
interface MyServiceClient {

  @Post("/user/kfc")
  @Produces("application/json")
  fun sendUserKfc(transactionDto: TransactionDto)
}

文档显示了一个示例,其中他们从这样构建的配置映射中插入值:

@Get("/api/${bintray.apiversion}/repos/${bintray.organization}/${bintray.repository}/packages") 

但是我如何在 @Client() 注释中使它起作用?

在该示例中,它们没有显示 bintray 如何变得 defined/injected/etc。这似乎与 @Value() 注释使用的语法相同。我也尝试过使用它,但我尝试使用的每个值最终都是 null

这非常令人沮丧,但我确定我错过了让这一切正常进行的关键部分。

I'm setting my client's base uri in application.dev.yml

你可能想要 application-dev.yml.

But how would I make this work in the @Client() annotation?

您可以使用 @Client("${myserviceclient.baseUri}").

之类的方式将配置键放入 @Client 值中

如果你想在你的代码中的某处使用 url 使用这个:

@Value("${micronaut.http.services.occupancy.urls}")
private String occupancyUrl;