Использование абстрактных запросов с Feign - PullRequest
0 голосов
/ 08 ноября 2019

Я пытаюсь использовать интерфейс в качестве RequestBody в Feign, но 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"
}

1 Ответ

0 голосов
/ 11 ноября 2019

Проблема заключается в типе параметра, когда мы вызываем 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...