我们正在使用 graphql-java 构建一个 graphql 服务器,但在符合 Relay 规范时遇到了麻烦。根据 Relay 规范,所有节点都必须可以通过单个查询检索:node(id: ID)
. graphql-java 文档显示了对 Relay 节点接口的支持,但是实际实现这一点的文档相当稀少。我们遇到的确切问题是了解如何为节点查询生成通用查找?Relay Todo 示例:https ://github.com/graphql-java/todomvc-relay-java展示了一个非常简单的基于代码的方法,使用单个数据获取器,这里的示例永远不需要“读取”节点“类型”或将该请求委托给正确的 dataFetcher。
schema.graphqls:
type Query {
node(id: ID!): Node
user(id: ID!): User
otherType(id:ID!): OtherType
}
interface Node {
id: ID!
}
type User implements Node {
id: ID!
firstName: String
lastName: String
}
type OtherType implements Node {
id: ID!
description: String
stuff: String
}
我们目前正在使用 SDL 来生成我们的架构(如下所示)
@Bean
private GraphQLSchema schema() {
Url url = Resources.getResource("schema.graphqls");
String sdl = Resources.toString(url, Charsets.UTF_8);
GraphQLSchema graphQLSchema = buildSchema(sdl);
this.graphQL = GraphQL.newGraphQL(graphQLSchema).build();
return graphQLSchema;
}
private GraphQLSchema buildSchema(String sdl) {
TypeDefinitionRegistry typeRegistry - new SchemaParser().parse(sdl);
RuntimeWiring runtimeWiring = buildWiring();
SchemaGenerator schemaGenerator = new SchemaGenerator();
return schemaGenerator.makeExecutableSchema(typeRegistry, runtimeWiring);
}
private RuntimeWiring buildWiring(){
return RuntimeWiring.newRuntimeWiring()
.type(newTypeWiring("Query")
.dataFetcher("user", userDispatcher.getUserById()))
.type(newTypeWiring("Query")
.dataFetcher("otherType", otherTypeDispatcher.getOtherTypeById()))
.type(newTypeWiring("Query")
.dataFetcher("node", /*How do we implement this data fetcher? */))
.build()
}
假设我们必须连接一个数据提取器,如上面最后一行所示。然而,这是文档开始变得模糊的地方。以上是否符合继电器规范?我们将如何实现一个单节点 dataFetcher,它返回对任何单个节点的引用,而不管底层类型(用户、其他类型等)如何?