Spring webclient выдает неподдерживаемое исключение медиатипа при попытке преобразовать bodyToMono<UUID>, POST-запрос
Я пытаюсь потреблять API с помощью Spring-WebClient. ниже мой код. код находится в kotlin
webClient.post()
.uri(“some url”)
.body(Mono.just(request))
.retrieve()
**.bodyToMono<UUID>()**
.awaitSingle()
ниже выдает ошибку
org.springframework.web.reactive.function.UnsupportedMediaTypeException: тип содержимого 'text/plain;charset=UTF-8' не поддерживается для bodyType=java.util.UUID
Если я пытаюсь преобразовать в строку, это работает нормально. код ниже
webClient.post()
.uri(“some url”)
.body(Mono.just(request))
.retrieve()
**.bodyToMono<String>()**
.awaitSingle()
Ответ, который я ожидаю от API, ниже
"response": {
"headers": {
"Content-Type": "text/plain;charset=UTF-8"
},
"status": 200,
"body": "6ea4c979-5e05-4e72-9007-c4644bef5672"
}
0 ответов
Вы получаете это исключение, потому что тип содержимого ответа text/plain;charset=UTF-8
и нет application/json
как указано в опубликованном вами сообщении об исключении. В сообщении об исключении также говорится, что вы пытаетесь разобрать тело ответа на UUID. Я не уверен, почему вы хотите это сделать, и это не удастся, потому что тело ответа не может быть сопоставлено с классом / объектом UUID, но это другая проблема.
Итак, чтобы решить вашу основную проблему на данный момент, вам нужно попросить Джексона принять text/plain
как это было application/json
и для этого вам нужно установить кодек в exchangeStrategies
метод при построении uo WebClient
.
Проверьте код ниже, он должен решить вашу проблему.
WebClient.builder()
.baseUrl(BASE_URL)
.clientConnector(new ReactorClientHttpConnector(httpClient))
.exchangeStrategies(ExchangeStrategies.builder().codecs(this::acceptedCodecs).build())
.build();
private void acceptedCodecs(ClientCodecConfigurer clientCodecConfigurer) {
clientCodecConfigurer.customCodecs().register(new Jackson2JsonEncoder(new ObjectMapper(), TEXT_HTML));
clientCodecConfigurer.customCodecs().register(new Jackson2JsonDecoder(new ObjectMapper(), TEXT_HTML));
}