如何在 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.graphqlstudent.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 模式和解析器?

如何在 GraphQL 和 Apollo 中部分模拟模式?