简体   繁体   English

使用 graphql-java-tools 和 graphql-spring-boot-starter 进行错误处理

[英]Error handling with graphql-java-tools and graphql-spring-boot-starter

How to handle errors in my graphQL API?如何处理我的 graphQL API 中的错误? I am using graphql-java-tools and graphql-spring-boot-starter.我正在使用 graphql-java-tools 和 graphql-spring-boot-starter。 I created error handler but every time I get response 200 even when exception was thrown.我创建了错误处理程序,但每次我收到响应 200,即使抛出异常也是如此。 Could you tell me how I should set error code eg 400 in response?你能告诉我应该如何设置错误代码,例如 400 作为响应吗?

@Component
public class CustomGraphQLErrorHandler implements GraphQLErrorHandler {

    @Override
    public List<GraphQLError> processErrors(List<GraphQLError> list) {
        return list.stream().map(this::getNested).collect(Collectors.toList());
    }

    private GraphQLError getNested(GraphQLError error) {
        if (error instanceof ExceptionWhileDataFetching) {
            ExceptionWhileDataFetching exceptionError = (ExceptionWhileDataFetching) error;
            if (exceptionError.getException() instanceof GraphQLError) {
                return (GraphQLError) exceptionError.getException();
            }
        }
        return error;
    }
}

The GraphQL server returns an HTTP 200 when it can accept the request (the syntax is valid, the server is up...). GraphQL 服务器在可以接受请求时返回 HTTP 200(语法有效,服务器已启动...)。

If an error occurs, it returns an 200 and fills the errors list in the response.如果发生错误,它会返回 200 并在响应中填写错误列表。

So, on client side, you will have:因此,在客户端,您将拥有:

  • Technical server errors, if the HTTP status is different from 200技术服务器错误,如果 HTTP 状态不同于 200
  • Errors when handling the request (technical or not) if the HTTP status is 200 and the errors list is not empty如果 HTTP 状态为 200 且错误列表不为空,则处理请求时出现错误(技术或非技术)
  • No error if the HTTP status is 200 and the errors list is not present (it should not be present and empty, according to the GraphQL spec)如果 HTTP 状态为 200 且错误列表不存在(根据 GraphQL 规范,它不应存在且为空),则不会出现错误

You can try to throw some exceptions in your error handling method eg您可以尝试在错误处理方法中抛出一些异常,例如

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 eg http://127.0.0.1:8080/graphql ...除了你只会得到 400 状态代码,而在你的响应中没有更多,因为 Spring 不在这里处理抛出的异常,因为你正在与 GraphQL servlet(而不是 Spring 一个)在例如http:// 127.0.0.1:8080/图形数据库

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)只有在您的日志中,您应该能够看到堆栈跟踪:(这只是一个示例,其中包含 GraphQL 查询中未使用片段的验证错误)

[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...)由您来引入更复杂的 GraphQL 错误处理,但这只是测试和试验(因为我们也已经做了很长一段时间......)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM