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