Как использовать карту с помощью Spring ClientResponse?

#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 может просмотреть содержимое этого объекта и выяснить, какие типы вы хотите использовать.