Как получить поле json по имени, используя Spring WebClient? - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть следующий ответ JSON:

{
    "Count": 1,
    "Products": [
        {
            "ProductID": 3423
        },
        {
            "ProductID": 4321
        }
    ]
}

Я хочу иметь возможность возвращать список «Product» из массива Products с помощью WebClient, не создавая отдельный класс Dto с полем 'Продукты ArrayList '

Я использовал что-то вроде этого

        webClient.get()
                .uri(uriBuilder -> uriBuilder
                .path(URI_PRODUCTS)
                .build())
                .accept(MediaType.APPLICATION_JSON)
                .retrieve()
                .bodyToFlux(Product.class)
                .collectList();

Он получает список с одним продуктом, но все значения равны нулю.Я могу заставить его работать с ответом DTO, таким как

...retrieve().bodyToMono(ProductResponse.class).block();

, где ProductResponse содержит Список продуктов.Но я пытаюсь избежать создания дополнительного класса.Есть ли способ получить поле, похожее на использование jsonPath (аналогично WebTestClient)?

1 Ответ

0 голосов
/ 18 февраля 2019

после retrieve() вы всегда можете .map свой результат для соответствующего типа.С помощью JsonNode path() метода экземпляра вы можете сделать это аналогично WebTestClient jsonPath()

webClient.get()
            .uri(uriBuilder -> uriBuilder
                .path(URI_PRODUCTS)
                .build())
            .accept(MediaType.APPLICATION_JSON)
            .retrieve()
            .bodyToMono(JsonNode.class)
            .map(s-> s.path("Products"))
            .map(s->{
                try {
                    return mapper.readValue(s.traverse(), new TypeReference<List<Product>>() {} );
                } catch (IOException e) {
                    e.printStackTrace();
                    return new ArrayList<Product>();
                }
            })
            .block();
...