diff --git a/src/main/java/graphql/servlet/DefaultGraphQLErrorHandler.java b/src/main/java/graphql/servlet/DefaultGraphQLErrorHandler.java index 1e054ad0..df53234c 100644 --- a/src/main/java/graphql/servlet/DefaultGraphQLErrorHandler.java +++ b/src/main/java/graphql/servlet/DefaultGraphQLErrorHandler.java @@ -44,6 +44,9 @@ protected List filterGraphQLErrors(List errors) { } protected boolean isClientError(GraphQLError error) { - return !(error instanceof ExceptionWhileDataFetching || error instanceof Throwable); + if (error instanceof ExceptionWhileDataFetching) { + return ((ExceptionWhileDataFetching) error).getException() instanceof GraphQLError; + } + return !(error instanceof Throwable); } } diff --git a/src/test/groovy/graphql/servlet/GraphQLServletSpec.groovy b/src/test/groovy/graphql/servlet/GraphQLServletSpec.groovy index 4b32e332..9082a948 100644 --- a/src/test/groovy/graphql/servlet/GraphQLServletSpec.groovy +++ b/src/test/groovy/graphql/servlet/GraphQLServletSpec.groovy @@ -641,6 +641,23 @@ class GraphQLServletSpec extends Specification { errors.first().message.startsWith("Internal Server Error(s)") } + def "errors that also implement GraphQLError thrown while data fetching are passed to caller"() { + setup: + servlet = createServlet({ throw new TestGraphQLErrorException("This is a test message") }) + request.addParameter('query', 'query { echo(arg:"test") }') + + when: + servlet.doGet(request, response) + + then: + response.getStatus() == STATUS_OK + response.getContentType() == CONTENT_TYPE_JSON_UTF8 + def errors = getResponseContent().errors + errors.size() == 1 + errors.first().extensions.foo == "bar" + errors.first().message.startsWith("Exception while fetching data (/echo) : This is a test message") + } + def "batched errors while data fetching are masked in the response"() { setup: servlet = createServlet({ throw new TestException() }) diff --git a/src/test/groovy/graphql/servlet/TestGraphQLErrorException.groovy b/src/test/groovy/graphql/servlet/TestGraphQLErrorException.groovy new file mode 100644 index 00000000..8dd910af --- /dev/null +++ b/src/test/groovy/graphql/servlet/TestGraphQLErrorException.groovy @@ -0,0 +1,32 @@ +package graphql.servlet + +import graphql.ErrorType +import graphql.GraphQLError +import graphql.language.SourceLocation + +/** + * @author Andrew Potter + */ +class TestGraphQLErrorException extends RuntimeException implements GraphQLError { + + public TestGraphQLErrorException(String message) { + super(message); + } + + @Override + public Map getExtensions() { + Map customAttributes = new LinkedHashMap<>(); + customAttributes.put("foo", "bar"); + return customAttributes; + } + + @Override + List getLocations() { + return null + } + + @Override + ErrorType getErrorType() { + return ErrorType.ValidationError; + } +}