#java #dictionary #webclient #spring-webflux #consuming
#java #словарь #webclient #spring-webflux #использование
Вопрос:
Во-первых, у меня есть URL-адрес REST, отображаемый таким образом:
@PostMapping("/check/existence")
@ResponseBody
public Map<String, MyObjectDto> checkExistence() {
//some code
затем у меня есть потребитель с веб-клиентом Spring, например :
ClientResponse response = webclient.post().uri....
Я хочу сделать что-то подобное :
Map<String, MyObjectDto> responseDto =
response.bodyToMono(Map.class).block();
но консоль возвращается ко мне
java.util.LinkedHashMap cannot be cast to org.mypackage.MyObjectDto
итак, как я могу использовать карту, набранную как Map<String, MyObjectDto>
?
Комментарии:
1. попробуйте что-то вроде
bodyToMono(new ParameterizedTypeReference<Map<String, MyObjectDto>>() {})
и посмотрите, работает ли это
Ответ №1:
Из документации класса ParameterizedTypeReference<T>
Цель этого класса — включить захват и передачу универсального типа. Чтобы захватить общий тип и сохранить его во время выполнения, вам необходимо создать подкласс (в идеале как анонимный встроенный класс) следующим образом:
Когда вам нужно сериализовать / десериализовать что-либо в тип, который использует общие (например, Map<k, v> или List)
Вы не можете использовать
response.bodyToMono(Map.class)
Таким образом, spring понятия не имеет, какие типы вы хотите поместить в карту. Вы собираетесь вводить int? строка? объект? Он понятия не имеет.
поэтому вместо этого вам нужно предоставить что-то, что включает информацию о типе.
bodyToMono(new ParameterizedTypeReference<Map<String, MyObjectDto>>() {})
ParameterizedTypeReference
это анонимный класс, который будет хранить информацию о вашем типе для вас. Таким образом, класс действует как сосуд для хранения информации о вашем типе, когда мы передаем ее в универсальную функцию bodyToMono, и таким образом spring может просмотреть содержимое этого объекта и выяснить, какие типы вы хотите использовать.