首页 > 解决方案 > 如何使用 graphql-java 响应扩展?

问题描述

我对 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>}
}

标签: javaspringgraphql

解决方案


我发现返回的最佳方法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实例? InstrumentationProviderfromgraphql-java-servlet可能是您用来执行此操作的方法)


推荐阅读