Java GraphQL - передать значения полей в резольвер для объектов

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

Другой способ выразить это, если у меня есть `Customer > User > Profile' - как я могу передать значение поля CustomerID, которое будет в customer, в Profile в качестве аргумента или переменной для правильного разрешения?

1 ответ

Есть ровно 4 возможности (по состоянию на graphql-java v11) предоставить информацию для распознавателя (DataFetcher) на любом уровне:

1) Непосредственно передать их в запросе (возможно, на нескольких уровнях):

{customer(id: 3) {
      user {
         profile(id: 3) {
             name
         }
      }
   }
}

2) Получить значения из исходного объекта

Источник - результат вложенного запроса. В вашем случае, источником для customer запрос - это корневой контекст (все, что вы указали во время выполнения запроса, например, graphQL.execute(query, rootContext)).
Источник для user запрос что угодно customer возвращен запрос, предположительно какой-то Customer пример.
Источник для profile запрос в любом случае user запрос возвращен, предположительно User пример. Вы можете получить источник через DataFetchingEnvironment#getSource(), Так что если User содержит CustomerID вы после, просто получить через ((User) env.getSource()).getCustomerId(), Если нет, рассмотрите возможность обернуть результат в объект, который будет содержать все, что вам нужно в подзапросах.

3) передать значения с помощью общего контекста

Вы можете, например, использовать ConcurrentHashMap как контекст:

ExecutionInput input = ExecutionInput.newExecutionInput()
  .query(operation)
  .context(new ConcurrentHashMap<String, Object>())
  .build()
graphQL.execute(query, input);

Затем внутри DataFetcher за customerхраните CustomerID внутрь:

Customer customer = getCustomer();
Map<String, Object> context = env.getContext();
context.put("CustomerID", customer.getId());

Позже, внутри DataFetcher за profileВы можете получить это из контекста:

Map<String, Object> context = env.getContext();
context.get("CustomerID");

Вместо ConcurrentHashMap, вы можете использовать типизированный объект, но вы должны убедиться, что поля volatile или добытчики / сеттеры synchronized или иначе потокобезопасный.

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

4) Непосредственно получить аргументы, передаваемые родительскому полю (возможно, начиная с graphql-java v11)

ExecutionStepInfo stepInfo = dataFetchingEnvironment.getExecutionStepInfo();
stepInfo.getParent().getArguments(); // get the parent arguments
Другие вопросы по тегам