Как создать собственный обработчик ошибок / исключений для graphql?

Итак, я написал микросервис, который использует Java-реализацию GraphQL для API. GraphQL обеспечивает определенный уровень проверки предоставленных клиентом запросов. Однако в тех случаях, когда проблема возникает при разрешении запроса, я видел сообщения graphql show, которые раскрывают внутреннюю часть службы micr.

Что мне нужно? Способ обработки всех исключений / ошибок, выдаваемых функциями преобразователя, таким образом, чтобы я мог очистить исключения / ошибки до того, как GraphQL создаст соответствующий ответ.

Я просмотрел официальную документацию и множество вопросов о переполнении стека, но не нашел ни одного места, где говорится об обработке. Если я обнаружил, то они были для предыдущих версий и больше не поддерживаются.

Некоторые из упомянутых мной ссылок: 1. https://www.howtographql.com/graphql-java/7-error-handling/ 2. GraphQL java отправляет настраиваемую ошибку в формате json 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.

person Ashish Singh    schedule 14.08.2019    source источник


Ответы (1)


Вам нужно переопределить метод errorsPresent в GraphQLErrorHandler, чтобы он возвращал истину, когда в этот метод передается ошибка. Что-то типа:

    @Override
    public boolean errorsPresent(List<GraphQLError> errors) {
        return !CollectionUtils.isEmpty(errors);
    }
person Javi Mendoza    schedule 03.09.2020