GraphQl variable using grapiql - variable is undefined
Asked Answered
N

1

6

I am using this endpoint:

 @PostMapping("graphql")
    public ResponseEntity<Object> getResource(@RequestBody Object query) { // String query
        ExecutionResult result;
        if (query instanceof String) {
            result = graphQL.execute(query.toString()); // if plain text
        } else{
            String queryString = ((HashMap) query).get("query").toString();
            Object variables = ((HashMap) query).get("variables");
            ExecutionInput input = ExecutionInput.newExecutionInput()
                    .query(queryString)
                    .variables((Map<String, Object>) variables) // "var1" -> "test1"
                    .build();

            result = graphQL.execute(input);
        }
        return new ResponseEntity<Object>(result, HttpStatus.OK);
    }

When i don't have variable it works fine:

query {
    getItem(dictionaryType: "test1") {
        code
        name
        description
    }
}

enter image description here

When i add variable it starts to fail, see here:

query {
    getItem(dictionaryType: $var1) {
        code
        name
        description
    }
}

enter image description here

In my schema i have defined the query section as followed:

type Query {
    getItem(dictionaryType: String): TestEntity
}

In java code:

@Value("classpath:test.graphqls")
private Resource schemaResource;
private GraphQL graphQL;

@PostConstruct
private void loadSchema() throws IOException {
        File schemaFile = schemaResource.getFile();
        TypeDefinitionRegistry registry = new SchemaParser().parse(schemaFile);
        RuntimeWiring wiring = buildWiring();
        GraphQLSchema schema = new SchemaGenerator().makeExecutableSchema(registry, wiring);
        graphQL = GraphQL.newGraphQL(schema).build();
}


private RuntimeWiring buildWiring() {
        initializeFetchers();
        return RuntimeWiring.newRuntimeWiring()
                .type("Query", typeWriting -> typeWriting
                        .dataFetcher("getItem", dictionaryItemFetcher)

                )
                .build();
}

private void initializeFetchers() {
        dictionaryItemFetcher = dataFetchingEnvironment ->
                dictionaryService.getDictionaryItemsFirstAsString(dataFetchingEnvironment.getArgument("dictionaryType"));
}
Noenoel answered 21/1, 2019 at 15:38 Comment(2)
Please update your question. The images should be removed and replaced with the text of the query you were attempting as well as the error you received. That will help others encountering the same error find this question, and it will prevent issues if the images you posted are ever removed.Incogitant
Daniel - in the future fell free to suggest edit - i will gladly accept it. I used an option available on stack-overflow - nothing more. I will edit the question in a moment.Noenoel
I
12

Any variables used inside an operation must be declared as part of the operation definition, like this:

query OptionalButRecommendedQueryName ($var1: String) {
  getItem(dictionaryType: $var1) {
    code
    name
    description
  }
}

This allows GraphQL to validate your variables against the provided type, and also validate that the variables are being used in place of the right inputs.

Incogitant answered 21/1, 2019 at 16:32 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.