[英]Using abstract requests with Feign
我正在尝试使用接口作为 Feign 中的 RequestBody,但 Feign 正在创建一个空的 object 作为请求。 这是不可能的还是我在这里做错了什么? 到目前为止,我找不到关于该主题的任何内容。
这是我正在尝试做的一个简化示例(实际上有 3 种不同类型的请求)
interface BookingClient {
@RequestLine("POST /booking")
@Headers("Content-Type: application/json")
fun createBooking(request: BookingRequest): BookingResponse
}
interface BookingRequest
data class NormalBooking(
val product: String
): BookingRequest
data class DiscountedBooking(
val product: String,
val discountCode: String
): BookingRequest
// Client Configuration
val client = Feign.builder()
.client(feign.okhttp.OkHttpClient())
.errorDecoder(BadEntityErrorDecoder())
.encoder(JacksonEncoder())
.decoder(JacksonDecoder(listOf(KotlinModule(), JavaTimeModule())))
.logger(feign.Logger.JavaLogger())
.logLevel(feign.Logger.Level.FULL)
.target(BookingClient::class.java, mockServer.getUrl())
如果我现在使用任一实现调用createBooking()
,Feign 总是序列化
{}
代替
{
"product": "productA"
}
和
{
"product": "productA",
"discountCode": "discountCode"
}
问题是参数类型,当我们调用 Feign.target(...) 时,Feign 开始将你的 BookingClient 解析为 Http 请求模板,而 body 类型是 BookingRequest,所以 Feign 总是序列化“{}”
interface BookingClient {
@RequestLine("POST /booking")
@Headers("Content-Type: application/json")
// BookingRequest should change to NormalBooking or DiscountedBooking
fun createBooking(request: BookingRequest): BookingResponse
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.