我的GraphQL响应必须遵循特定的格式
{
data:{}
errors:[{}]
extensions:{}
}
然而,我不确定如何从我的方法扩展响应。我使用的是graphql-spring- Boot ,它可以拉入graphql-java、graphql-java-tools和graphql-java-servlet。
我知道查询/变异方法的结果将被 Package 在数据对象中,如果抛出任何异常,它们将被 Package 在错误中。
如果我有一个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>}
}
4条答案
按热度按时间6ioyuze21#
我发现返回
extensions
的最好方法是实现SimpleInstrumentation
的子类,它覆盖instrumentExecutionResult
(代码部分来自graphql-java的TracingInstrumentation
):在设置
GraphQL
示例时,然后将instrumentation类的示例传入:(Not完全确定
graphql-spring-boot
是如何处理的,但可以想象有一些方法可以配置@Autowire
或GraphQL
示例?graphql-java-servlet
中的InstrumentationProvider
可能就是您要使用的)kokeuurv2#
好吧,在这上面花了20个小时。终于想通了。需要大量的试验和错误。此外,我们肯定没有适当的/足够的文件。
虽然我的解决方案回答了这个问题,但它也回答了一个额外的问题,即->如何使扩展对每个查询都是动态的?
这意味着,所有3个(数据,错误和扩展)在响应中都是动态的。
我的用例-如何在扩展中为每个查询添加日志?
答案-(注意-下面的代码包含lombok注解)
第一步-创建您的插装类和插装状态类。
步骤2 -创建graphql对象-
步骤3 -创建执行输入。这是将动态Log对象传递到
LogsInstrumentation
类的地方。步骤4 -这是如何在查询完成后获取扩展名。
My source
mrzz3bfm3#
从graphql-java 21.0开始,可以直接在
DataFetcherResult
上设置extensions
:https://github.com/graphql-java/graphql-java/blob/v21.0/src/main/java/graphql/execution/DataFetcherResult.java#L205添加了here。如果你还在使用旧版本的graphql-java,你可以从
DataFetchingEnvironment
中得到它,如下所示:dgiusagp4#
你可以实现
GraphQLError
,其中可以添加额外的错误属性。