使用spring boot starter暴露GraphqlExceptions

时间:2018-05-04 01:45:46

标签: spring spring-boot kotlin graphql

当使用Spring引导程序启动graphql时,数据获取时抛出的所有异常在输出控制台中显示为“执行查询时的内部服务器错误”我希望只有e.message()字符串GraphQLException我抛出来自Graphql中错误字段的“消息”部分,以便此API的前端可以看到出错的地方。

我用谷歌搜索这个无济于事。大多数人通过编辑Servlet来揭露错误,但由于我使用的是Spring Boot启动程序,因此无法轻松完成。我知道,starter使用的graphql-servlet有一个名为DefaultGraphQLErrorHandler的类here,但我不知道如何覆盖或更改它,或者只是以某种方式显示这些错误。

我尝试覆盖graphql中的SimpleDataFetcherExceptionHandler,创建一个覆盖GraphQlException但没有工作的CustomException,但在调试期间从未调用过SimpleDataFetcherExceptionHandler实现。

我只看到这个:

Graphql error output

由于

3 个答案:

答案 0 :(得分:5)

所以我想出来了。我必须提供GraphQLErrorHandler 的自定义实现,通过标记为@Component将其添加到bean列表中。然后我覆盖了错误处理程序中的processErrors()函数。当标记为组件时,此bean自动装入graphql spring boot starter包中的graphql serverlet配置器中,替换默认值。

我添加的CustomGraphQlErrorHandler如下所示:

import graphql.GraphQLError
import graphql.servlet.GenericGraphQLError
import graphql.servlet.GraphQLErrorHandler
import org.springframework.stereotype.Component

@Component
class CustomGraphQlErrorHandler: GraphQLErrorHandler {

    override fun processErrors(errors: MutableList<GraphQLError>?): MutableList<GraphQLError> {
        val errorList = mutableListOf<GraphQLError>()
        for(error in errors!!){
            errorList.add(GenericGraphQLError(error.message))
        }
        return errorList
    }

} 

输出现在看起来像这样: enter image description here

答案 1 :(得分:1)

当您在SimpleDataFetcherExceptionHandler中拥有graphql.servlet.exception-handlers-enabled=true时,将调用

application.properties实现

答案 2 :(得分:0)

出色的解决方案就像魅力。

用kotlin编写的更紧凑的方法如下:

@Component
class CustomGraphQlErrorHandler : GraphQLErrorHandler {

    override fun processErrors(errors: MutableList<GraphQLError>?) =
            errors?.map { GenericGraphQLError(it.message) }?.toMutableList() ?: mutableListOf()

}

我真的很喜欢它的功能风格