Предоставьте GraphqlExceptions с помощью стартера весенней загрузки

При использовании стартера Spring Boot для graphql все исключения, возникающие при выборке данных, отображаются в консоли вывода как «Внутренние ошибки сервера при выполнении запроса». Я бы хотел, чтобы выводилась только строка e.message() из GraphQLException, который я выбрасываю. части «сообщение» поля ошибки в Graphql, чтобы интерфейсная часть этого API могла видеть, что пошло не так.

Я погуглил это безрезультатно. Большинство людей выявляют ошибки, редактируя сервлет, но, поскольку я использую стартер Spring Boot, я не могу сделать это легко. Я знаю, что у graphql-servlet, используемого стартером, есть класс под названием DefaultGraphQLErrorHandler, найденный здесь, но я не знаю, как переопределить или изменить его или просто каким-то образом отобразить эти ошибки.

Я попытался переопределить SimpleDataFetcherExceptionHandler в graphql, создав CustomException, которое переопределяет GraphQlException, но ни один из них не работал, реализация SimpleDataFetcherExceptionHandler никогда не вызывалась во время отладки.

Я только такое вижу:

Предоставьте GraphqlExceptions с помощью стартера весенней загрузки

Спасибо

4
0
2 924
3

Ответы 3

Итак, я понял это. Мне пришлось предоставить настраиваемую реализацию GraphQLErrorHandlerа также, добавить его в список bean-компонентов, пометив как @Component. Затем я переопределил функцию processErrors() в обработчике ошибок. Когда этот компонент был помечен как компонент, этот bean-компонент был автоматически подключен к конфигуратору serverlet graphql в стартовом пакете загрузки graphql spring, заменив тот, который используется по умолчанию.

Добавленный мной 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
    }

} 

теперь результат выглядит так:

Спасибо за ваш пост, но мой GraphQErrorHandler не вызывается. Я всегда получаю внутренние ошибки сервера при выполнении запроса. Любое предложение? Может быть, у вас есть другие версии зависимостей для graphql?

Guchelkaben 10.12.2018 11:04

Подобно этому подходу, у меня был класс конфигурации, который представлял реализацию @beanGraphQLErrorHandler. Это работало для меня до моей недавней попытки обновления с com.graphql-java-kickstart:graphql-spring-boot-starter:5.2 на com.graphql-java-kickstart:graphql-spring-boot-starter:5.4 | 5.3.1. Есть версия 5.4.1-SNAPSHOT, в которой это исправлено. Рекомендую следить за билетом здесь

DaddyMoe 10.01.2019 13:32

@Guchelkaben Я столкнулся с аналогичной проблемой. Мой GraphQLErrorHandler не вызывается. Могу я узнать, разрешили ли вы это. Мой сервлет Gragpql версии 6.x

Bharatha Aravind 05.02.2019 20:00

Отличное решение работает как шарм.

Более компактный способ записи на котлине будет выглядеть так:

@Component
class CustomGraphQlErrorHandler : GraphQLErrorHandler {

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

}

Мне очень нравится функциональный стиль этого

Реализация SimpleDataFetcherExceptionHandler будет вызываться, когда у вас есть graphql.servlet.exception-handlers-enabled=true в application.properties

Другие вопросы по теме