GraphQL-如何捕获“内部” Apollo / GraphQL错误-Java Spring Boot

时间:2018-12-14 06:52:47

标签: java spring spring-boot graphql apollo

我开始使用GraphQL工作了一个星期,但我仍然找不到如何捕获“内部” GraphQL错误,例如 CoercingParseValueException 。因为我们的前端使用此终结点来接收有关运输的一些信息。如果缺少架构或必填字段,则GraphQL本身会发送一条错误消息,该错误消息仅包含一条带有任意字符串的消息,您必须在前端解析这些消息才能理解此消息并向客户端显示正确的错误。

对于我们的项目,我们为自定义错误定义了一个错误模型。此错误模型包含一个代码字段,该字段具有针对每种情况(例如NotFoundException,ValidationException等)的自定义代码。

但是如何从GraphQL中捕获错误并进行修改?

方法:

@Component
public class GraphQLErrorHandler implements graphql.servlet.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;
    }

} 

不适用于我。永远不会调用ProcessErrors。我正在使用Spring Boot (Kickstarter Version)

对于自定义错误,我使用了已发布10天的新功能。

@Component("CLASSPATH TO THIS CLASS")
public class GraphQLExceptionHandler {

    @ExceptionHandler({NotFoundException.class})
    GraphQLError handleNotFoundException(NotFoundException e) {
        return e;
    }

    @ExceptionHandler(ValidationException.class)
    GraphQLError handleValidationException(ValidationException e) {
        return e;
    }
}

此方法与自定义错误消息完美配合。要使用此功能,我必须启用graphql-servlet属性 exception-handlers-enabled 并将其设置为true。但是,即使使用Exception.class定义了ExceptionHandler注释,该方法也无法捕获“内部” Apollo / GraphQL错误。

也许可以帮助我解决这个问题?

非常感谢

1 个答案:

答案 0 :(得分:0)

尝试一下。您应该针对一般异常返回ThrowableGraphQLError类型

@ExceptionHandler(Exception::class)
fun handleException(e: Exception): ThrowableGraphQLError {
    log.error("{}", e)
    return ThrowableGraphQLError(e, "Internal Server Error")
}