如何在 Spring 中为 GraphQL 实现异常处理程序

Posted

技术标签:

【中文标题】如何在 Spring 中为 GraphQL 实现异常处理程序【英文标题】:How to implement exception handler for GraphQL in Spring 【发布时间】:2020-01-07 11:31:48 【问题描述】:

我正在构建使用 GraphQL 和 leangen graphql-spqr 的 Web 应用程序。 我有异常处理的问题。例如,在服务类中,我使用 spring bean 验证来检查一些有效性,如果它不正确,它会抛出 ConstraintViolationException。 有没有办法添加一些异常处理程序来向客户端发送正确的消息?像ExceptionHandler 之类的东西用于rest api 中的控制器? 或者也许应该以其他方式完成?

【问题讨论】:

【参考方案1】:

我找到的解决方案是实现 DataFetcherExceptionHandler,覆盖 onException 方法并将其设置为默认异常处理程序。

public class ExceptionHandler implements DataFetcherExceptionHandler 

    @Override
    public DataFetcherExceptionHandlerResult onException(DataFetcherExceptionHandlerParameters handlerParameters) 

    Throwable exception = handlerParameters.getException();

    // do something with exception

    GraphQLError error = GraphqlErrorBuilder
            .newError()
            .message(exception.getMessage())
            .build();

    return DataFetcherExceptionHandlerResult
            .newResult()
            .error(error)
            .build();
    

并将其设置为查询和突变的默认异常处理程序

GraphQL.newGraphQL(someSchema)
            .queryExecutionStrategy(new AsyncExecutionStrategy(new ExceptionHandler()))
            .mutationExecutionStrategy(new AsyncExecutionStrategy(new ExceptionHandler()))
            .build();

【讨论】:

请注意,如果您想保留默认值,突变的默认策略是AsyncSerialExecutionStrategy 如果您想真正保留默认值,最好使用defaultDataFetcherExceptionHandler 方法设置异常处理程序。

以上是关于如何在 Spring 中为 GraphQL 实现异常处理程序的主要内容,如果未能解决你的问题,请参考以下文章

有啥方法可以在 Spring Boot 项目中为 graphql 端点创建 API 文档

OrchardCore 中为现有类型 实现自定义 Graphql 查询

如何在类型定义中为 GraphQL 字段定义数组数据类型

如何在 GraphQL 中为键值定义枚举

如何在 GraphiQL 中为 GraphQL 查询和突变添加名称?

如何在我的 GraphQL 中为对象中的对象列表定义类型