Skip to content

Commit ca01d11

Browse files
committed
Problem: non-null types for variables don't get processed
These variables are still converted to maps Solution: handle NonNullTypes
1 parent 779f2c0 commit ca01d11

File tree

2 files changed

+33
-4
lines changed

2 files changed

+33
-4
lines changed

src/main/java/graphql/servlet/GraphQLVariables.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,7 @@
1717
import com.fasterxml.jackson.core.JsonProcessingException;
1818
import com.fasterxml.jackson.databind.ObjectMapper;
1919
import graphql.annotations.GraphQLObjectTypeWrapper;
20-
import graphql.language.OperationDefinition;
21-
import graphql.language.TypeName;
22-
import graphql.language.VariableDefinition;
20+
import graphql.language.*;
2321
import graphql.parser.Parser;
2422
import graphql.schema.GraphQLSchema;
2523
import graphql.schema.GraphQLType;
@@ -46,7 +44,16 @@ public GraphQLVariables(GraphQLSchema schema, String query, Map<String, Object>
4644
.forEach(new Consumer<VariableDefinition>() {
4745
@SneakyThrows
4846
@Override public void accept(VariableDefinition d) {
49-
GraphQLType type = schema.getType(((TypeName) (d.getType())).getName());
47+
GraphQLType type;
48+
Type t = d.getType();
49+
if (t instanceof TypeName) {
50+
type = schema.getType(((TypeName) t).getName());
51+
} else if (t instanceof NonNullType) {
52+
accept(new VariableDefinition(d.getName(), ((NonNullType) t).getType()));
53+
return;
54+
} else {
55+
type = null;
56+
}
5057
if (type instanceof GraphQLObjectTypeWrapper) {
5158
String value = objectMapper.writeValueAsString(variables.get(d.getName()));
5259
Object val = objectMapper.readValue(value, ((GraphQLObjectTypeWrapper) type).getObjectClass());

src/test/java/graphql/servlet/GraphQLVariablesTest.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,4 +79,26 @@ public void variableTyping() {
7979
assertEquals(((ComplexQueryProvider.Data)d).getField1(), "1");
8080
assertEquals(((ComplexQueryProvider.Data)d).getField2(), "2");
8181
}
82+
83+
private static final String NON_NULL_QUERY = "query Q($d: Data!) { data { echo(data: $d) { field1 field2 } } }";
84+
85+
@Test
86+
public void nonNullvariableTyping() {
87+
GraphQLServlet servlet = new GraphQLServlet();
88+
ComplexQueryProvider queryProvider = new ComplexQueryProvider();
89+
servlet.bindQueryProvider(queryProvider);
90+
GraphQLSchema schema = servlet.getSchema();
91+
HashMap<String, Object> data = new HashMap<>();
92+
data.put("field1", "1");
93+
data.put("field2", "2");
94+
HashMap<String, Object> vars = new HashMap<>();
95+
vars.put("d", data);
96+
GraphQLVariables variables = new GraphQLVariables(schema, NON_NULL_QUERY, vars);
97+
Object d = variables.get("d");
98+
System.out.println("d = " + d);
99+
assertTrue(d instanceof ComplexQueryProvider.Data);
100+
assertEquals(((ComplexQueryProvider.Data)d).getField1(), "1");
101+
assertEquals(((ComplexQueryProvider.Data)d).getField2(), "2");
102+
}
103+
82104
}

0 commit comments

Comments
 (0)