我正在尝试 Springs 声明式 REST 客户端(使用 org.springframework.web.client.RestClient)。
我有一个包装纸:
@JvmInline
value class CustomId(val id: String)
现在我想在我的界面中使用该包装器:
interface FooClient {
@GetExchange(value = "/service/{id}")
fun hamtaTaxeringsenhet(@PathVariable id: CustomId): Bar
}
这样做的问题是 Spring 使用其
CustomId
函数转换 toString()
并将其发送到下游服务器。
如果我使用 String 而不是我的自定义类型,它会起作用:
interface FooClient {
@GetExchange(value = "/service/{id}")
fun hamtaTaxeringsenhet(@PathVariable id: String): Bar
}
但是我想要类型安全,所以我不想使用 String。 我也不想重写 CustomId 的 toString() 函数。
有什么想法可以让 Spring 自动将 CustomId 转换为字符串(CustomId.id)吗?
问候,彼得
当然,我在发布问题几分钟后自己找到了答案,尽管我花了几个小时搜索并尝试了很多东西! :D
我在没有 ConversionService 的情况下设置了 FooClient,现在当我这样做时它可以工作了:
@Bean
fun fooClient(restClient: RestClient, conversionService: ConversionService): FooClient {
return HttpServiceProxyFactory
.builderFor(RestClientAdapter.create(restClient))
.conversionService(conversionService) // <- Added this
.build()
.createClient(FooClient::class.java)
}