【问题标题】:How to respond with extensions using graphql-java?如何使用 graphql-java 响应扩展?
【发布时间】:2019-06-12 04:14:02
【问题描述】:

我对 GraphQL 的回复必须遵循特定的格式

{
    data:{}
    errors:[{}]
    extensions:{}
}

但是,我不确定如何使用我的方法的扩展来响应。 我正在使用 graphql-spring-boot,它引入了 graphql-java、graphql-java-tools 和 graphql-java-servlet。

我知道我的查询/变异方法的结果将被包装在数据对象中,如果抛出任何异常,它们将被包装在错误中。

如果我将 GraphQL Schema 定义为

type Query {
    someQuery(input: String!) : String!
}

以及对应的Java方法

public String someQuery(String input) {
    return "Hello, world!";
}

GraphQL 响应将是

{
    data: { "Hello, world!"}
}

我想知道如何将扩展添加到我的 GraphQL 响应中,以便输出如下:

{
    data: {"Hello, world!"}
    extensions: { <something>}
}

【问题讨论】:

    标签: java spring graphql


    【解决方案1】:

    我发现返回extensions 的最佳方法是实现SimpleInstrumentation 的子类,覆盖instrumentExecutionResult(部分代码从graphql-java 的TracingInstrumentation 窃取):

    @Override
    public CompletableFuture<ExecutionResult> instrumentExecutionResult(
            ExecutionResult executionResult,
            InstrumentationExecutionParameters parameters) {
        Map<Object, Object> currentExt = executionResult.getExtensions();
        Map<Object, Object> newExtensionMap = new LinkedHashMap<>();
        newExtensionMap.putAll(currentExt == null ? Collections.emptyMap() : currentExt);
        newExtensionMap.put("MyExtensionKey", myExtensionValue);
    
        return CompletableFuture.completedFuture(
            new ExecutionResultImpl(
                executionResult.getData(), 
                executionResult.getErrors(), 
                newExtensionMap));
    }
    

    在设置 GraphQL 实例时,您将在以下位置传递检测类的实例:

    GraphQL graphQL = GraphQL
            .newGraphQL(schema)
            .instrumentation(new MyInstrumentation())
            .build()
    

    (不完全确定graphql-spring-boot 是如何处理的,但可以想象@Autowire 或以其他方式配置GraphQL 实例的方法?InstrumentationProvider 来自graphql-java-servlet 可能是您常用的这样做)

    【讨论】:

      【解决方案2】:

      您可以实现GraphQLError,其中可以添加额外的错误属性。

      【讨论】:

        猜你喜欢
        • 2021-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多