每个环境都有基本URL的Micronaut声明式客户端

时间:2019-11-27 22:27:15

标签: kotlin micronaut micronaut-client

根据我是在本地开发环境还是在生产环境,我希望能够使用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读取任何值,只是将const值设置为类的静态值。我希望BASE_URL值可以根据我所处的环境而动态变化。

要使用此类,我创建了一个声明式客户端,如下所示:

@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是如何被定义/注入/等的。这似乎与@Value()批注使用的语法相同。我也尝试过使用它,但是我尝试使用的每个值最终都是null

这非常令人沮丧,但是我确定我缺少使这一切都起作用的关键部分。

2 个答案:

答案 0 :(得分:1)

  

我正在application.dev.yml中设置客户的基本uri

您可能想要application-dev.yml

  

但是我该如何在@Client()批注中进行这项工作?

您可以使用@Client之类的东西在@Client("${myserviceclient.baseUri}")值中放入配置键。

答案 1 :(得分:0)

如果你想在你的代码中的某个地方使用这个网址:

Article