2

How can I receive a Map<String, Integer> from an endpoint web service using WebClient in Spring Boot? Here is my try: (it gives syntax error: Incompatible equality constraint: Map<String, Integer> and Map). How can I fix it?

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);
}
Khaled
  • 345
  • 5
  • 14

1 Answers1

4

For generic types, like the Map, you should use ParameterizedTypeReference instead of a class in the call to the bodyToFlux method:

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<>() {});
}

In practice, probably you would like to define a constant for the type reference:

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);
}
Mafor
  • 9,668
  • 2
  • 21
  • 36