Как получить карту от конечной точки, используя Spring WebClient get?

#spring-boot #spring-webflux #spring-webclient

#spring-boot #пружина-webflux #весна-вебклиент #spring-webflux #spring-webclient

Вопрос:

Как я могу получить карту <строка, целое число> от веб-службы конечной точки, используя WebClient в Spring Boot? Вот моя попытка: (выдает синтаксическую ошибку: Incompatible equality constraint: Map<String, Integer> and Map ). Как я могу это исправить?

 public Flux<Map<String, Integer>> findAll(String param1, String param2) {
    return webClient.get()
            .uri(uriBuilder -> uriBuilder
                    .path("/url")
                    .queryParam("param1", param1)
                    .queryParam("param2", param2)
                    .build())
            .accept(MediaType.APPLICATION_JSON)
            .retrieve()
            .bodyToFlux(Map.class);
}
  

Ответ №1:

Для универсальных типов, таких как Map, вы должны использовать ParameterizedTypeReference вместо класса при вызове метода bodyToFlux:

 public Flux<Map<String, Integer>> findAll(String param1, String param2) {
    return webClient.get()
        .uri(uriBuilder -> uriBuilder
            .path("/url")
            .queryParam("param1", param1)
            .queryParam("param2", param2)
            .build())
        .accept(MediaType.APPLICATION_JSON)
        .retrieve()
        .bodyToFlux(new ParameterizedTypeReference<>() {});
}
  

На практике, вероятно, вы хотели бы определить константу для ссылки на тип:

 private static final ParameterizedTypeReference<Map<String, Integer>> MAP_TYPE_REF = new ParameterizedTypeReference<>() {};

public Flux<Map<String, Integer>> findAll(String param1, String param2) {
    return webClient.get()
        .uri(uriBuilder -> uriBuilder
            .path("/url")
            .queryParam("param1", param1)
            .queryParam("param2", param2)
            .build())
        .accept(MediaType.APPLICATION_JSON)
        .retrieve()
        .bodyToFlux(MAP_TYPE_REF);
}