Как анализировать и маршалировать ответ GraphQL на объекты Java POJO?

Очень новичок в GraphQL ...

Я отправляю запросы GraphQL на внешний сервер, который контролируется третьей стороной.

Используя этот запрос GraphQL:

query Photos($first: Int!, $propertyId: String) {
  viewer {
    content {
      contentLists(first: $first, property_id: $propertyId, contentListType: IMAGE, publishState: PUBLISHED, orderBy: originalPublishDate, orderByDirection: DESC) {
        edges {
          node {
            id
            title
            caption
            originalPublishDate
            lastModifiedDate
            contents(first: $first) {
              edges {
                node {
                  id
                  title
                  caption
                  type
                  ... on Image {
                    asset {
                      createdDate
                      lastModifiedDate
                      id
                      url
                      title
                      height
                      width
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

Переменные запроса:

{
  "propertyId" : "23456832-7862-5679-4342-415f32385830",
  "first": 20
}

Используя этот фрагмент кода, я могу отправить запрос на внешний сервер:

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("Authorization", "Bearer "+accessToken);

HttpEntity<String> entity = new HttpEntity<String>(request,headers);
String response = restTemplate.postForObject(EXTERNAL_URL, entity, String.class);

Получил следующий ответ:

{
"data": {
    "viewer": {
        "content": {
            "contentLists": {
                "edges": [
                {
                    "node": {
                    "id": "3510e8f7-452s-f531-43b0-ac36ba979e5a9f4m",
                    "title": "Homer Simpson goes Camping",
                    "caption": "Homer Simpson goes Camping",
                    "originalPublishDate": "2018-02-18T03:31:56.352Z",
                    "lastModifiedDate": "2018-02-18T03:32:13.530Z",
                    "contents": {
                        "edges": [
                        {
                            "node": {
                                "id": "3506d951-1332-86fg-42bc-b11183db50394f40",
                                "title": "No Title",
                                "caption": "",
                                "type": "IMAGE",
                                "asset": {
                                    "createdDate": "2018-02-18T03:31:38.406Z",
                                    "lastModifiedDate": "2018-02-18T03:31:38.991Z",
                                    "id": "65037262-7169-7065-7861-7035676a6f65323467617866",
                                    "url": "",
                                    "title": "No Title",
                                    "height": null,
                                    "width": null
                                }
                            }
                        }
                    ]
                }
            }
         }
      ]
    }
  }

Используя эти библиотеки Java:

<dependency>
    <groupId>com.graphql-java</groupId>
    <artifactId>graphql-java</artifactId>
    <version>8.0</version>
</dependency>

<dependency>
    <groupId>com.graphql-java</groupId>
    <artifactId>graphql-java-tools</artifactId>
    <version>5.0.0</version>
</dependency>

Как я могу упорядочить ответ на POJO и / или ArrayList POJO?

Есть ли лучший набор библиотек, которые могли бы помочь мне проанализировать / маршалировать GraphQL с помощью Java?

Кстати, сторонний сервер не предоставляет файл схемы GraphQL ...

Разве это не помогает? baeldung.com/graphql

Tarun Lalwani 18.05.2018 07:58

@TarunLalwani - как это может мне помочь, если я сказал вам, что внешний сервер закрыт и не предоставляет файл схемы GraphQL. Их представитель сказал мне разобрать JSON изначально. В предоставленном вами руководстве представлена ​​схема / IDL. Тем не менее, спасибо за обращение.

PacificNW_Lover 18.05.2018 08:42

Я думаю, вам все равно придется создавать POJO самостоятельно, поскольку вы знаете поля. Потому что у библиотеки нет способа узнать, на сколько объектов ее разбить. Или вы могли бы просто использовать библиотеку jackson и сопоставить ее с POJO из данных ответа. baeldung.com/jackson-object-mapper-tutorial. Если схемы нет, то POJO необходимо описать в одну или другую сторону.

Tarun Lalwani 18.05.2018 09:41

Мои соболезнования @PacificNW_Lover. Как будто они не хотят, чтобы их сервис был легким в использовании.

David J. Liszewski 02.03.2021 14:58
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
4
4 760
2

Ответы 2

Если вам нужно сгенерировать эти классы только один раз и использовать их для каждого последующего вызова, вы можете загрузить инструмент сопоставления JSON в POJO. Доступно множество утилит; просто при быстром поиске мне удалось найти несколько вариантов:

Когда у вас есть классы POJO, вы можете использовать стандартный картограф Джексона, чтобы получить класс

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("Authorization", "Bearer "+accessToken);

HttpEntity<String> entity = new HttpEntity<String>(request,headers);
String rawResponse = restTemplate.postForObject(EXTERNAL_URL, entity, String.class);

ObjectMapper objectMapper = new ObjectMapper();
PhotoQueryResponse response = objectMapper.readValue(rawResponse, PhotoQueryResponse.class);

Извините, я уже знаю об этих инструментах. Я спрашивал, есть ли способ маршалинга с использованием библиотек graphql-java.

PacificNW_Lover 24.05.2018 01:06

@PacificNW_Lover У меня тоже такая же проблема, поэтому я решил создать свою собственную библиотеку, чтобы помочь разобрать ответ и запрос graphQL, вы можете взглянуть на это здесь github.com/daviestobialex/bpd-grapgql-parser, это не закончено, но это работа

DaviesTobi alex 15.07.2019 15:46

Вы можете проверить эту java-библиотеку под названием,

Glitr (GraphQL для Java), а руководство в здесь.

Вот его сладкие поддерживаемые типы,

GraphQLString           String
GraphQLBoolean          Boolean
GraphQLInt              Integer
GraphQLFloat            Float
GraphQLObjectType       Any POJO
GraphQLInterfaceType    Any interface type
GraphQLUnionType        Not supported
GraphQLEnumType         Any enum type
GraphQLInputObjectType  Any POJO
GraphQLList             Any implementing class of Collection
GraphQLNonNull          See @GlitrNonNull

Другие вопросы по теме