You can try to throw some exceptions in your error handling method e.g.
package my.company.graphql.error;
import java.util.List;
import java.util.stream.Collectors;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ResponseStatusException;
import graphql.GraphQLError;
import graphql.GraphQLException;
import graphql.servlet.core.GraphQLErrorHandler;
import graphql.validation.ValidationError;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Component
public class GraphQLErrorHandlerImpl implements GraphQLErrorHandler {
@Override
public List<GraphQLError> processErrors(List<GraphQLError> graphQLErrors) {
return graphQLErrors.stream().map(this::handleGraphQLError).collect(Collectors.toList());
}
private GraphQLError handleGraphQLError(GraphQLError error) {
if (error instanceof GraphQLException) {
throw new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR, "GraphQLException as GraphQLError...", (GraphQLException) error);
} else if (error instanceof ValidationError){
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "ValidationError: " + error.getMessage());
} else {
log.error("Yet another GraphQLError...", error);
return error;
}
}
}
...except you'll only get the 400 status code and nothing more in your response because Spring is not here to handle the thrown exceptions as you're talking with the GraphQL servlet (not the Spring one) at e.g. http://127.0.0.1:8080/graphql
Only in your log you should be able to see the stacktrace: (this is just an example with a validation error for an unused fragment in the GraphQL query)
[2020-09-23 15:59:34.382]-[080-exec-2]-[INFO ]-[g.s.AbstractGraphQLHttpServlet]: Bad POST request: parsing failed
org.springframework.web.server.ResponseStatusException: 400 BAD_REQUEST "ValidationError: Validation error of type UnusedFragment: Unused fragment someUnusedFragment"
at my.company.graphql.error.GraphQLErrorHandlerImpl.handleGraphQLError(GraphQLErrorHandlerImpl.java:33) ~[classes/:na]
It's up to you to introduce a more complex handling of GraphQL errors, but that'll just be test & trial (as we've also done for quite some time...)