在Feign中使用抽象请求

我试图在Feign中使用接口作为RequestBody,但是Feign正在创建一个空对象作为请求。这不可能吗,或者我在这里做错了吗?到目前为止,我在该主题上找不到任何内容。

这是我要执行的操作的简化示例(实际上有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"
}
avepointer111 回答:在Feign中使用抽象请求

问题是参数类型,当我们调用Feign.target(...)时,Feign开始将BookingClient解析为Http请求模板,主体类型为BookingRequest,因此Feign总是序列化“ {}”

interface BookingClient {
    @RequestLine("POST /booking")
    @Headers("Content-Type: application/json")
    // BookingRequest should change to NormalBooking or DiscountedBooking
    fun createBooking(request: BookingRequest): BookingResponse
}
本文链接:https://www.f2er.com/3136947.html

大家都在问