如何为 graphql 创建自定义错误/异常处理程序?

Posted

技术标签:

【中文标题】如何为 graphql 创建自定义错误/异常处理程序?【英文标题】:How to create a custom error/exception handler for graphql? 【发布时间】:2019-12-20 22:16:22 【问题描述】:

所以,我一直在编写一个使用 GraphQL 的 Java 实现 API 的微服务。 GraphQL 对客户端提供的查询强制执行某种级别的验证。但是,如果在解决查询时出现问题,我已经看到 graphql 显示消息,这些消息暴露了 micr-service 的内部。

我需要什么?一种处理解析器函数抛出的所有异常/错误的方法,这样我就可以在 GraphQL 创建相应的响应之前清理异常/错误。

我查看了官方文档和许多堆栈溢出问题,但未能找到任何关于处理的地方。如果我发现了,它们是以前的版本,不再受支持。

我提到的一些链接 - 1.https://www.howtographql.com/graphql-java/7-error-handling/ 2.GraphQL java send custom error in json format 3.https://www.graphql-java.com/documentation/v13/execution/

我已经做了下面的事情,比如 -

创建自定义处理程序

@Bean
public GraphQLErrorHandler errorHandler() 
    return new CustomGraphQLErrorHandler();

public class CustomGraphQLErrorHandler implements GraphQLErrorHandler 

    @Override
    public List<GraphQLError> processErrors(List<GraphQLError> errors) 
        List<GraphQLError> clientErrors = errors.stream()
                .filter(this::isClientError)
                .collect(Collectors.toList());

        List<GraphQLError> serverErrors = errors.stream()
                .filter(this::isSystemError)
                .map(GraphQLErrorAdapter::new)
                .collect(Collectors.toList());

        List<GraphQLError> e = new ArrayList<>();
        e.addAll(clientErrors);
        e.addAll(serverErrors);
        return e;
    

    private boolean isSystemError(GraphQLError error) 
        return !isClientError(error);
    

    private boolean isClientError(GraphQLError error) 
        return !(error instanceof ExceptionWhileDataFetching || error instanceof Throwable);
    
```

Expected behavior - The control would reach to `processErrors` method. Actual - It doesn't reach there.

【问题讨论】:

【参考方案1】:

您需要覆盖GraphQLErrorHandler 中的errorsPresent 方法,以便在将错误传递给该方法时返回true。比如:

    @Override
    public boolean errorsPresent(List<GraphQLError> errors) 
        return !CollectionUtils.isEmpty(errors);
    

【讨论】:

以上是关于如何为 graphql 创建自定义错误/异常处理程序?的主要内容,如果未能解决你的问题,请参考以下文章

处理 Android 自定义内容提供程序中的(跨进程)异常

Django Rest Framework - 如何为所有 ModelSerializer 字段创建自定义错误消息?

如何自定义 Java GraphQL 错误响应

如何为 Spring Boot Rest 使用自定义异常?

如何为管道中的异常值删除实现 Python 自定义类?

如何为 404 Not Found 创建自定义响应消息?