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

时间:2019-01-17 21:48:42

标签: java spring graphql

我对GraphQL的回复必须遵循

的特定格式
{
    data:{}
    errors:[{}]
    extensions:{}
}

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

我了解到我来自查询/变异方法的结果将被包装在数据对象中,并且如果引发任何异常,则将它们包装在错误中。

如果我将GraphQL模式定义为

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

2 个答案:

答案 0 :(得分:0)

我发现返回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是如何处理的,但是会想象有某种方法可以{{1}来配置@Autowire或以其他方式配置GraphQL实例吗?InstrumentationProvider }}可能就是您要做的事情

答案 1 :(得分:-1)

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