#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);
}