Я использую клиент dgs javagraphql в своем коде. Я хочу построить запрос и указать в нем переменные, я хочу получить что-то вроде этого::
{
"query": "query ExampleQuery($first: Int, $filter: ExampleFilter) { exampleData(first: $first, filter: $filter) { id }",
"variables": {
"filter": {
"field": "test"
},
"first": 25
}
}
Для этого я пишу что-то вроде следующего кода:
GraphQLQueryRequest request = new GraphQLQueryRequest(
ExampleDataGraphQLQuery.newRequest()
.queryName("ExampleQuery")
.filter(ExampleFilterInput.newBuilder().field("test").build())
.first(25),
new ExampleProjectionRoot<>().id()
);
Example response = graphQLClient
.executeQuery(request.serialize(), request.getQuery().getInput())
.extractValueAsObject(DgsConstants.QUERY.Example, Example.class);
Но в итоге при выполнении запроса получаю, что используются не переданные переменные, а статические значения непосредственно в запросе, примерно так:
{
"query": "exampleData(first: 25, filter: { field: \"test\"}) { id }",
"variables": {
"filter": {
"field": "test"
},
"first": 25
}
}
То есть переменные фактически не используются, хотя в теле запроса они присутствуют.
Я понимаю, что сам не связал переменные с телом запроса, но я не нашел четкого способа подставить переменные в запрос ни в документации, ни в других примерах где-либо еще. Подскажите, пожалуйста, как с помощью dgs java clientgraphql выполнить запрос с подстановкой параметров?
🤔 А знаете ли вы, что...
Spring позволяет конфигурировать приложения с помощью аннотаций и Java-based конфигурации.
Ваш вопрос имеет смысл, но на самом деле он не поддерживается запросами codegen. Идея состоит в том, что если вы создаете свой запрос в таком коде, вы можете просто передать переменные в код Java. Практическая проблема заключалась бы в том, что аргументы в запросе codegen являются типизированными, поэтому Int является целым числом в Java, что также означает, что вы не сможете передать туда $myVar.
Я согласен, что немного сбивает с толку то, что API запросов кодегена не поддерживает переменные, в то время как queryExecutor явно поддерживает, но технически эти API полностью разделены.
Если вам нужно использовать переменные, я бы рекомендовал использовать многострочную строку в Java/Kotlin и писать запрос таким образом. С Intellij у вас также есть аннотация `@Language("GraphQL"), что делает это довольно хорошим вариантом.
Обратите внимание, что изначально ответ на этот ответ был дан на странице обсуждений DGS.