如何使用 graphql-java 响应扩展?

Joh*_*Doe 7 java spring graphql

我来自 GraphQL 的响应必须遵循特定的格式

{
    data:{}
    errors:[{}]
    extensions:{}
}
Run Code Online (Sandbox Code Playgroud)

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

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

如果我有一个 GraphQL 架构定义为

type Query {
    someQuery(input: String!) : String!
}
Run Code Online (Sandbox Code Playgroud)

以及相应的Java方法

public String someQuery(String input) {
    return "Hello, world!";
}
Run Code Online (Sandbox Code Playgroud)

GraphQL 响应将是

{
    data: { "Hello, world!"}
}
Run Code Online (Sandbox Code Playgroud)

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

{
    data: {"Hello, world!"}
    extensions: { <something>}
}
Run Code Online (Sandbox Code Playgroud)

Joe*_*Joe 6

我发现返回的最好方法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));
}
Run Code Online (Sandbox Code Playgroud)

设置GraphQL实例时,您可以将仪器类的实例传递到:

GraphQL graphQL = GraphQL
        .newGraphQL(schema)
        .instrumentation(new MyInstrumentation())
        .build()
Run Code Online (Sandbox Code Playgroud)

(完全不确定这是如何处理的,graphql-spring-boot但可以想象有某种方法可以@Autowire或以其他方式配置GraphQL实例? InstrumentationProviderfromgraphql-java-servlet可能是您用来执行此操作的方法)


小智 -1

您可以实现GraphQLError可以添加额外错误属性的位置。