我对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>}
}
答案 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
,可以在其中添加额外的错误属性。