diff --git a/graphql-kickstart-spring-support/src/main/java/graphql/kickstart/spring/AbstractGraphQLController.java b/graphql-kickstart-spring-support/src/main/java/graphql/kickstart/spring/AbstractGraphQLController.java index 18da9d43..17f7fac6 100644 --- a/graphql-kickstart-spring-support/src/main/java/graphql/kickstart/spring/AbstractGraphQLController.java +++ b/graphql-kickstart-spring-support/src/main/java/graphql/kickstart/spring/AbstractGraphQLController.java @@ -39,6 +39,7 @@ public Object graphqlPOST( @Nullable @RequestParam(value = "query", required = false) String query, @Nullable @RequestParam(value = "operationName", required = false) String operationName, @Nullable @RequestParam(value = "variables", required = false) String variablesJson, + @Nullable @RequestParam(value = "extensions", required = false) String extensionsJson, @Nullable @RequestBody(required = false) String body, ServerWebExchange serverWebExchange) { @@ -58,6 +59,7 @@ public Object graphqlPOST( request.getQuery(), request.getOperationName(), request.getVariables(), + request.getExtensions(), serverWebExchange); } @@ -68,7 +70,11 @@ public Object graphqlPOST( if (query != null) { return executeRequest( - query, operationName, convertVariablesJson(variablesJson), serverWebExchange); + query, + operationName, + convertVariablesJson(variablesJson), + convertExtensionsJson(extensionsJson), + serverWebExchange); } // * If the "application/graphql" Content-Type header is present, @@ -76,7 +82,8 @@ public Object graphqlPOST( if ("application/graphql".equals(contentType.toString()) || "application/graphql; charset=utf-8".equals(contentType.toString())) { - return executeRequest(body, null, Collections.emptyMap(), serverWebExchange); + return executeRequest( + body, null, Collections.emptyMap(), Collections.emptyMap(), serverWebExchange); } throw new ResponseStatusException( @@ -88,10 +95,14 @@ public Object graphqlGET( @Nullable @RequestParam("query") String query, @Nullable @RequestParam(value = "operationName", required = false) String operationName, @Nullable @RequestParam(value = "variables", required = false) String variablesJson, + @Nullable @RequestParam(value = "extensions", required = false) String extensionsJson, ServerWebExchange serverWebExchange) { - return executeRequest( - query, operationName, convertVariablesJson(variablesJson), serverWebExchange); + query == null ? "" : query, + operationName, + convertVariablesJson(variablesJson), + convertExtensionsJson(extensionsJson), + serverWebExchange); } private Map convertVariablesJson(String jsonMap) { @@ -100,10 +111,17 @@ private Map convertVariablesJson(String jsonMap) { .orElseGet(Collections::emptyMap); } + private Map convertExtensionsJson(String jsonMap) { + return Optional.ofNullable(jsonMap) + .map(objectMapper::deserializeExtensions) + .orElseGet(Collections::emptyMap); + } + protected abstract Object executeRequest( String query, String operationName, Map variables, + Map extensions, ServerWebExchange serverWebExchange); protected Object handleBodyParsingException(Exception exception) { diff --git a/graphql-kickstart-spring-webflux/src/main/java/graphql/kickstart/spring/webflux/GraphQLController.java b/graphql-kickstart-spring-webflux/src/main/java/graphql/kickstart/spring/webflux/GraphQLController.java index 0420028b..52e6b6d2 100644 --- a/graphql-kickstart-spring-webflux/src/main/java/graphql/kickstart/spring/webflux/GraphQLController.java +++ b/graphql-kickstart-spring-webflux/src/main/java/graphql/kickstart/spring/webflux/GraphQLController.java @@ -33,10 +33,11 @@ protected Object executeRequest( String query, String operationName, Map variables, + Map extensions, ServerWebExchange serverWebExchange) { GraphQLSingleInvocationInput invocationInput = invocationInputFactory.create( - new GraphQLRequest(query, variables, operationName), serverWebExchange); + new GraphQLRequest(query, variables, extensions, operationName), serverWebExchange); Mono executionResult = Mono.fromCompletionStage(graphQLInvoker.executeAsync(invocationInput)); return executionResult.map(objectMapper::createResultFromExecutionResult);