diff --git a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/HttpRequestInvokerImpl.java b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/HttpRequestInvokerImpl.java index 829bf091..1b58c8ba 100644 --- a/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/HttpRequestInvokerImpl.java +++ b/graphql-java-servlet/src/main/java/graphql/kickstart/servlet/HttpRequestInvokerImpl.java @@ -1,7 +1,11 @@ package graphql.kickstart.servlet; +import static graphql.kickstart.servlet.HttpRequestHandler.STATUS_BAD_REQUEST; +import static graphql.kickstart.servlet.HttpRequestHandler.STATUS_INTERNAL_SERVER_ERROR; + import graphql.ExecutionResult; import graphql.ExecutionResultImpl; +import graphql.GraphQLException; import graphql.kickstart.execution.FutureExecutionResult; import graphql.kickstart.execution.GraphQLInvoker; import graphql.kickstart.execution.GraphQLQueryResult; @@ -76,10 +80,22 @@ private void invokeAndHandleAsync( .getAsyncExecutor() .execute( () -> { - FutureExecutionResult futureResult = invoke(invocationInput, request, response); - futureHolder.set(futureResult); - handle(futureResult, request, response, listenerHandler) - .thenAccept(it -> asyncContext.complete()); + try { + FutureExecutionResult futureResult = invoke(invocationInput, request, response); + futureHolder.set(futureResult); + handle(futureResult, request, response, listenerHandler) + .thenAccept(it -> asyncContext.complete()); + } catch (GraphQLException e) { + response.setStatus(STATUS_BAD_REQUEST); + log.info("Bad request: cannot handle http request", e); + listenerHandler.onError(e); + asyncContext.complete(); + } catch (Exception e) { + response.setStatus(STATUS_INTERNAL_SERVER_ERROR); + log.error("Cannot handle http request", e); + listenerHandler.onError(e); + asyncContext.complete(); + } }); }