Сопоставление ответа GraphQL с классом в Java/Spring

#java #spring #graphql

Вопрос:

У меня возникли некоторые проблемы с отображением ответа GraphQL на класс, и я, вероятно, упускаю что-то очевидное, поэтому мне нужна вторая пара глаз на мой код, я думаю.

У меня есть ответ, который выглядит так:

 {
    "data": {
        "Area": [
            {
                "id": "1"
            },
            {
                "id": "2"
            }
        ]
    }
}
 

Мой потребитель и клиент выглядит так:

 public class Consumer {

    private final WebClient webClient;

    private static final String QUERY = "query { Area { id }}";

    public Consumer(WebClient webClient) {
        this.webClient = webClient;
    }

    public AreaResponse.AreaData getAreas() {
        var request = new GraphQLRequest(QUERY, null);

        var res = webClient.post()
                .bodyValue(request)
                .retrieve()
                .bodyToMono(AreaResponse.class)
                .block();

        return res.getData();
    }
}
 

И, наконец, мой ответ dto:

 @Data
public class AreaResponse {
    private AreaData data;

    @Data
    public class AreaData{
        private Collection<Area> Area;

        @Data
        public class Area{
            private String id;
        }
    }
}
 

Если я сопоставлю ответ String.class , я получу те же данные, что и в Postman, так что в запросе или конечной точке нет ничего плохого. Но когда я пытаюсь сопоставить AreaResponse Area объект с нулем. Я не уверен, правильна ли иерархия в моем классе ответов или мне следует переместить коллекцию на шаг вниз?

Комментарии:

1. пожалуйста, не используйте block для получения значения от издателя, подобного этому. вы мгновенно превратили свое приложение в более не реагирующее, так что вы можете просто написать его процедурно.

2. Спасибо за совет!

Ответ №1:

Я думаю, что проблема возникает из-за использования верхнего регистра Area в ответе. По умолчанию Джексон попытается сопоставить все содержимое с версией имени класса в нижнем регистре (или в нижнем регистре).

Один из способов исправить это:

 @JsonProperty("Area")
private Collection<Area> Area;
 

P.S. вложенные/ внутренние классы могут быть статическими, поэтому public static class AreaData и т. Д.