Как использовать переменные в запросе Graphql через клиент dgs Java Graphql?

Я использую клиент 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 конфигурации.


107
1

Ответ:

Решено

Ваш вопрос имеет смысл, но на самом деле он не поддерживается запросами codegen. Идея состоит в том, что если вы создаете свой запрос в таком коде, вы можете просто передать переменные в код Java. Практическая проблема заключалась бы в том, что аргументы в запросе codegen являются типизированными, поэтому Int является целым числом в Java, что также означает, что вы не сможете передать туда $myVar.

Я согласен, что немного сбивает с толку то, что API запросов кодегена не поддерживает переменные, в то время как queryExecutor явно поддерживает, но технически эти API полностью разделены.

Если вам нужно использовать переменные, я бы рекомендовал использовать многострочную строку в Java/Kotlin и писать запрос таким образом. С Intellij у вас также есть аннотация `@Language("GraphQL"), что делает это довольно хорошим вариантом.

Обратите внимание, что изначально ответ на этот ответ был дан на странице обсуждений DGS.