kotlin - Micronaut 声明式客户端,每个环境具有基本 URL
问题描述
我希望能够根据我是在本地开发环境还是生产环境中使用 Micronaut 的声明式客户端来访问不同的端点。
我将客户的基本 uri 设置为application.dev.yml
:
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
.
这非常令人沮丧,但我确信我错过了一个让这一切正常工作的关键部分。
解决方案
我在 application.dev.yml 中设置我客户的基本 uri
你可能想要application-dev.yml
.
但是我如何在 @Client() 注释中完成这项工作?
您可以@Client
使用类似@Client("${myserviceclient.baseUri}")
.
推荐阅读
- c++11 - 生成器找不到新创建的按钮
- html - 如何阻止内容溢出容器
- react-native - mac os 中的 Expo-CLI (high sierra)
- rest - POST 在重复项上返回 409 时是非幂等的吗?
- vue.js - 使用 EventBus 更新组件中的数据时出现问题
- math - 获得所有可能的限制组合的算法
- imagemagick - 当 alpha 为零时,RGB 分量在调整大小时丢失
- typescript - 如何将简单的 TypeScript 类型转换为降价表?
- next.js - Nextjs 将 /pages/api 更改为 /pages/myApi?
- sql - Oracle 在为空或空时选择许多列