【问题标题】:Using abstract requests with Feign在 Feign 中使用抽象请求
【发布时间】:2020-03-05 05:50:25
【问题描述】:

我正在尝试将接口用作 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"
}

【问题讨论】:

    标签: spring-boot kotlin jackson feign


    【解决方案1】:

    问题在于参数类型,当我们调用 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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-19
      • 2016-05-17
      • 1970-01-01
      • 2016-02-06
      • 1970-01-01
      • 1970-01-01
      • 2020-08-25
      • 2019-01-13
      相关资源
      最近更新 更多