Skip to content

Commit 2455981

Browse files
committed
Problem: GraphQL sends variables as JSON, GraphiQL as string
Solution: accept both
1 parent 01a8360 commit 2455981

File tree

1 file changed

+23
-11
lines changed

1 file changed

+23
-11
lines changed

src/main/java/graphql/servlet/GraphQLServlet.java

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,15 @@
1414
*/
1515
package graphql.servlet;
1616

17-
import com.fasterxml.jackson.annotation.JsonProperty;
17+
import com.fasterxml.jackson.annotation.JsonGetter;
18+
import com.fasterxml.jackson.core.JsonParser;
19+
import com.fasterxml.jackson.core.JsonProcessingException;
1820
import com.fasterxml.jackson.core.type.TypeReference;
21+
import com.fasterxml.jackson.databind.DeserializationContext;
22+
import com.fasterxml.jackson.databind.JsonDeserializer;
1923
import com.fasterxml.jackson.databind.ObjectMapper;
24+
import com.fasterxml.jackson.databind.RuntimeJsonMappingException;
25+
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
2026
import com.google.common.io.CharStreams;
2127
import graphql.*;
2228
import graphql.schema.GraphQLFieldDefinition;
@@ -162,23 +168,29 @@ public String executeQuery(String query) {
162168
}
163169
}
164170

171+
private static class VariablesDeserializer extends JsonDeserializer<Map<String, Object>> {
172+
173+
@Override public Map<String, Object> deserialize(JsonParser p, DeserializationContext ctxt)
174+
throws IOException {
175+
Object o = p.readValueAs(Object.class);
176+
if (o instanceof Map) {
177+
return (Map<String, Object>) o;
178+
} else if (o instanceof String) {
179+
return new ObjectMapper().readValue((String) o, new TypeReference<Map<String, Object>>() {});
180+
} else {
181+
throw new RuntimeJsonMappingException("variables should be either an object or a string");
182+
}
183+
}
184+
}
185+
165186
public static class Request {
166187
@Getter @Setter
167188
private String query;
168-
@Getter
189+
@Getter @Setter @JsonDeserialize(using = VariablesDeserializer.class)
169190
private Map<String, Object> variables = new HashMap<>();
170191
@Getter @Setter
171192
private String operationName;
172193

173-
@SneakyThrows @JsonProperty("variables")
174-
public String getVariablesAsString() {
175-
return new ObjectMapper().writeValueAsString(variables);
176-
}
177-
178-
@SneakyThrows
179-
public void setVariables(String variables) {
180-
this.variables = new ObjectMapper().readValue(variables, new TypeReference<Map<String, Object>>() {});
181-
}
182194
}
183195

184196
@Override

0 commit comments

Comments
 (0)