如何在 GraphQL Java 中解析多个模式文件
Posted
技术标签:
【中文标题】如何在 GraphQL Java 中解析多个模式文件【英文标题】:How to parse multiple schema files in GraphQL Java 【发布时间】:2018-03-15 15:10:20 【问题描述】:我在 java 中使用 GraphQL。我有几个要解析的模式文件。任何人都可以让我知道是否有办法做到这一点。我使用了下面的方法,它只允许解析一个模式文件。
@Value("classpath:dashboard.graphql")
private Resource schemaResource;
File schemaFile = schemaResource.getFile();
TypeDefinitionRegistry definitionRegistry = new SchemaParser().parse(schemaFile);
假设我有两个架构文件,例如 dashboard.graphql 和 student.graphql。那么如何解析这两个文件呢?
谁能解释一下。
谢谢
【问题讨论】:
嗨,在节点中,我们正在使用库 merge-graphql-schemas(github.com/okgrow/merge-graphql-schemas)。检查java中是否有这样的支持库 【参考方案1】:我们使用schemaParserBuilder
:
SchemaParserBuilder parser = SchemaParser.newParser();
parser.files(arrayOfFileNames);//fill the array with the paths to your schema files
//define other properties like resolvers here
GraphQLSchema schema = parser.build().makeExecutableSchema();
如果您需要 TypeDefinitionRegistry
-object 的另一个想法。只需分别阅读所有架构文件,将它们合并到String
并使用schemaParser.parse(String schema)
。事实上parser.files
正是这样做的。
【讨论】:
当我将 .files 与多个文件一起使用时,我的查询对象只会从数组中输入的最后一个文件中显示,你有没有机会遇到这种情况?【参考方案2】:我知道这是一个老问题,但 SO 答案出现在官方 GraphQL-java documentation 之前,所以我想我会在这里发布:
SchemaParser schemaParser = new SchemaParser();
SchemaGenerator schemaGenerator = new SchemaGenerator();
File schemaFile1 = loadSchema("starWarsSchemaPart1.graphqls");
File schemaFile2 = loadSchema("starWarsSchemaPart2.graphqls");
File schemaFile3 = loadSchema("starWarsSchemaPart3.graphqls");
TypeDefinitionRegistry typeRegistry = new TypeDefinitionRegistry();
// each registry is merged into the main registry
typeRegistry.merge(schemaParser.parse(schemaFile1));
typeRegistry.merge(schemaParser.parse(schemaFile2));
typeRegistry.merge(schemaParser.parse(schemaFile3));
GraphQLSchema graphQLSchema = schemaGenerator.makeExecutableSchema(typeRegistry, buildRuntimeWiring());
【讨论】:
这是事实……尽管这种合并非常有限。它不合并查询,因此它的目的是将您的 1 模式拆分为位,而不是合并模式。因此这是行不通的。事实上,如果你把所有的模式连接成一个字符串,然后用它来创建一个模式,你实际上会得到相同的结果。以上是关于如何在 GraphQL Java 中解析多个模式文件的主要内容,如果未能解决你的问题,请参考以下文章
GraphQL with Java - 如何将解析器分成多个类
如何使用 Apollo 分离 GraphQL 模式和解析器文件?
带有 Spring 的 GraphQL-java - 解析器 vd datafetcher
如何在 .graphql 文件中编写 GraphQl Upsert Query
我们如何从 apollo-server 模块传递 ApolloServer 中的数据源和合并的 graphql 模式和解析器?