首页 > 解决方案 > 在 graphql-java 下尝试使用分析时出现 NonNullableFieldWasNullError

问题描述

我对graphql相当陌生,即使我搜索过,也找不到下面给出的错误的答案,任何帮助都将不胜感激。

我正在尝试使用 MaxQueryComplexityInstrumentation 来计算给定查询的复杂性。这里我使用的后端是一个模拟后端(https://api.graph.cool/simple/v1/swapi)。

下面给出的代码适用于本地 graphql 服务器,但不适用于模拟后端。我注意到的一个区别是,当为模式中的特定查询提供所需的符号(“!”)时,这似乎正在发生。

在用调试器尝试了代码后,我发现这个错误是由“.execute()”调用引起的。另外,请注意,模拟后端返回值并且不提供任何空值作为响应。

这是为设置 MaxQueryComplexityInstrumentation 而编写的代码。

    private boolean queryComplexityAnalysis(String payload) {
        GraphQL runtime = GraphQL.newGraphQL(schema)
                .instrumentation(new MaxQueryComplexityInstrumentation(GraphQLAPISecurityConstants.MAX_QUERY_COMPLEXITY))
                .build();

        try {
            ExecutionResult execution = runtime.execute(payload);
            List<GraphQLError> errors = execution.getErrors();
            if (errors.size()>0) {
                for(GraphQLError temp : errors) {
                    log.error(temp);
                }
                return false;
            }
            System.out.println("Maximum query complexity was not exceeded");
            return true;
        } catch (Throwable e) {
            log.error(e);
        }
        return false;
    }

如果 MAX_QUERY_COMPLEXITY = 3,并且我传入一个复杂度为 7 的查询,它会给出正确的响应,说明超出了最大查询复杂度。

graphql.execution.AbortExecutionException: maximum query complexity exceeded 7 > 3

但是,如果我传入一个小于或等于 3 的查询(例如,“{ allFilms{title episodeId}}”),它会给出如下所示的 NonNullableFieldWasNullError。尽管这里的预期结果只是打印“未超过最大查询复杂度”。

NonNullableFieldWasNullError{message='Cannot return null for non-nullable type: 'null' within parent 'Query' (/allFilms)', path=[allFilms]}

任何帮助将不胜感激。提前致谢!

标签: javagraphqlgraphql-java

解决方案


推荐阅读