diff --git a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/subscriptions/GraphQLSubscriptionMapper.java b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/subscriptions/GraphQLSubscriptionMapper.java index 1e4c8459..e0dc28a2 100644 --- a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/subscriptions/GraphQLSubscriptionMapper.java +++ b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/subscriptions/GraphQLSubscriptionMapper.java @@ -2,9 +2,11 @@ import com.fasterxml.jackson.core.JsonProcessingException; import graphql.ExecutionResult; +import graphql.GraphQLException; import graphql.kickstart.execution.GraphQLObjectMapper; import graphql.kickstart.execution.GraphQLRequest; import java.util.Map; +import java.util.Objects; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor @@ -12,7 +14,17 @@ public class GraphQLSubscriptionMapper { private final GraphQLObjectMapper graphQLObjectMapper; - public GraphQLRequest readGraphQLRequest(Object payload) { + public GraphQLRequest readGraphQLRequest(String payload) { + Objects.requireNonNull(payload, "Payload is required"); + try { + return graphQLObjectMapper.getJacksonMapper().readValue(payload, GraphQLRequest.class); + } catch (JsonProcessingException e) { + throw new GraphQLException("Cannot read GraphQL request from payload '" + payload + "'", e); + } + } + + public GraphQLRequest convertGraphQLRequest(Object payload) { + Objects.requireNonNull(payload, "Payload is required"); return graphQLObjectMapper.getJacksonMapper().convertValue(payload, GraphQLRequest.class); } @@ -20,8 +32,8 @@ public ExecutionResult sanitizeErrors(ExecutionResult executionResult) { return graphQLObjectMapper.sanitizeErrors(executionResult); } - public boolean areErrorsPresent(ExecutionResult executionResult) { - return graphQLObjectMapper.areErrorsPresent(executionResult); + public boolean hasNoErrors(ExecutionResult executionResult) { + return !graphQLObjectMapper.areErrorsPresent(executionResult); } public Map convertSanitizedExecutionResult(ExecutionResult executionResult) { diff --git a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/subscriptions/apollo/SubscriptionStartCommand.java b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/subscriptions/apollo/SubscriptionStartCommand.java index e7d0db3f..0f9ec377 100644 --- a/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/subscriptions/apollo/SubscriptionStartCommand.java +++ b/graphql-java-kickstart/src/main/java/graphql/kickstart/execution/subscriptions/apollo/SubscriptionStartCommand.java @@ -34,7 +34,7 @@ public void apply(SubscriptionSession session, OperationMessage message) { private CompletableFuture executeAsync(Object payload, SubscriptionSession session) { Objects.requireNonNull(payload, "Payload is required"); - GraphQLRequest graphQLRequest = mapper.readGraphQLRequest(payload); + GraphQLRequest graphQLRequest = mapper.convertGraphQLRequest(payload); GraphQLSingleInvocationInput invocationInput = invocationInputFactory.create(graphQLRequest, session); return graphQLInvoker.executeAsync(invocationInput); @@ -42,7 +42,7 @@ private CompletableFuture executeAsync(Object payload, Subscrip private void handleSubscriptionStart(SubscriptionSession session, String id, ExecutionResult executionResult) { ExecutionResult sanitizedExecutionResult = mapper.sanitizeErrors(executionResult); - if (!mapper.areErrorsPresent(sanitizedExecutionResult)) { + if (mapper.hasNoErrors(sanitizedExecutionResult)) { session.subscribe(id, sanitizedExecutionResult.getData()); } else { Object payload = mapper.convertSanitizedExecutionResult(sanitizedExecutionResult); diff --git a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/GraphQLWebsocketServlet.java b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/GraphQLWebsocketServlet.java index 30b745b9..7673cb42 100644 --- a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/GraphQLWebsocketServlet.java +++ b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/GraphQLWebsocketServlet.java @@ -198,6 +198,7 @@ public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, response.getHeaders().put(HandshakeRequest.SEC_WEBSOCKET_PROTOCOL, new ArrayList<>(asList(subscriptionProtocolFactory.getProtocol()))); } + } /** diff --git a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/subscriptions/FallbackSubscriptionConsumer.java b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/subscriptions/FallbackSubscriptionConsumer.java index 81bd69bd..92a28907 100644 --- a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/subscriptions/FallbackSubscriptionConsumer.java +++ b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/subscriptions/FallbackSubscriptionConsumer.java @@ -30,7 +30,7 @@ public void accept(String text) { executionResult.thenAccept(result -> handleSubscriptionStart(session, UUID.randomUUID().toString(), result)); } - private CompletableFuture executeAsync(Object payload, SubscriptionSession session) { + private CompletableFuture executeAsync(String payload, SubscriptionSession session) { Objects.requireNonNull(payload, "Payload is required"); GraphQLRequest graphQLRequest = mapper.readGraphQLRequest(payload); @@ -40,7 +40,7 @@ private CompletableFuture executeAsync(Object payload, Subscrip private void handleSubscriptionStart(SubscriptionSession session, String id, ExecutionResult executionResult) { ExecutionResult sanitizedExecutionResult = mapper.sanitizeErrors(executionResult); - if (!mapper.areErrorsPresent(sanitizedExecutionResult)) { + if (mapper.hasNoErrors(sanitizedExecutionResult)) { session.subscribe(id, sanitizedExecutionResult.getData()); } else { Object payload = mapper.convertSanitizedExecutionResult(sanitizedExecutionResult);