java - 如何使用 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>}
}
解决方案
我发现返回的最佳方法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
fromgraphql-java-servlet
可能是您用来执行此操作的方法)
推荐阅读
- angular - 如何使用服务 ChangeDetectorRef 更新 Angular 12 中的视图
- r - 在 R 中完成 Tibble 的 NA
- arrays - Swift 从 ArraySlices 返回 Array
- python - 如何使用字典理解创建一个空的三重嵌套字典?
- python - python csv文件在文本的某些部分放置单引号
- javascript - 使用 Promise 和 await 代替 then()
- python - Power BI Python 通过使用正则表达式解析现有列来创建新列
- javascript - 在javascript中选择新添加的dom元素
- docker - 设置 Apache Airflow 时无法执行脚本 docker-compose
- javascript - getStaticProps 不向 Next.JS 上的页面返回任何数据