一、GraphQL最开始就是定义Schema,并有SchemaParser解析并处理
定义有3三方式:
1. SchemaParser.newParser构建一个SchemaParserBuilder,并直接编写schemaString
// My application class SchemaParser.newParser() .schemaString("Query { }")
2. SchemaParser.newParser构建一个SchemaParserBuilder,并指定文件路径
// My application class SchemaParser.newParser() .file("my-schema.graphqls")
3. 由Spring构建,先SchemaStringProvider提供所有的schema文件。然后交给SchemaParserBuilder解析。
@Bean @ConditionalOnBean({GraphQLResolver.class}) @ConditionalOnMissingBean public SchemaParser schemaParser( List<GraphQLResolver<?>> resolvers, SchemaStringProvider schemaStringProvider, SchemaParserOptions.Builder optionsBuilder, @Autowired(required = false) SchemaParserDictionary dictionary, @Autowired(required = false) GraphQLScalarType[] scalars, @Autowired(required = false) List<SchemaDirective> directives, @Autowired(required = false) List<SchemaDirectiveWiring> directiveWirings )
Spring构建 SchemaParser时,自动装载
1. GraphQLResolver //Field 字段处理器
工具将GraphQL对象上的字段映射到Java对象上的方法和属性。对于大多数标量字段,带有字段和/或getter方法的POJO足以描述GraphQL中的数据。更复杂的字段(如查找另一个对象)通常需要具有GraphQL上下文(存储库、连接等)未提供的状态的更复杂方法。graphqljava工具使用“数据类”和“解析器”的概念来解释这两种情况。当给定resolver实例时,graphqljava工具首先尝试将字段映射到解析器上的方法,然后再将它们映射到数据类上的字段或方法。如果解析器上有匹配的方法,则将数据类实例作为第一个参数传递给解析器函数。这不适用于根解析程序,因为它们没有要解析的数据类。可以定义一个可选参数来注入DataFetchingEnvironment,并且必须是最后一个参数。
2. SchemaStringProvider // Schema文件提供者
多个源将按给定的顺序连接在一起,允许您根据需要模块化模式。
3. SchemaParserOptions.Builder // 解析器选项
4. SchemaParserDictionary // 实体映射词典
有时graphqljava工具在扫描对象时找不到类,这通常是由于接口和联合类型的限制。有时您的Java类也与GraphQL模式不完全一致。GraphQLJava工具允许您手动提供其他类,并根据需要“重命名”它们。
5. GraphQLScalarType
通过创建GraphQLScalarType类的新实例,可以在graphqljava中创建自定义标量类型。要在GraphQL Java工具中使用自定义标量,请将标量添加到GraphQL schema 中:
6. SchemaDirective
有关指令的详细说明,包括如何在SDL中定义指令和创建所需类的示例,请参见Schema指令,要将自定义SchemaDirectiveWiring添加到graphql,java工具在使用创建SchemaParser时传递它
7. SchemaDirectiveWiring
不管任何一种模式,最终构建的所有schema都会加入到SchemaParserBuilder的 private val schemaString 中。
二、SchemaParserBuilder进行解析
1. scan解析入口(使用提供的schema和dictionary扫描类。)
调用parseDefinitions获取schema定义的所有Definitions,schema解析成Definitions是由Parser完成
Definitions主要包括,都是实现了Definition接口
DirectiveDefinition
EnumValueDefinition
InputObjectTypeDefinition
InterfaceTypeDefinition
ObjectTypeDefinition
ScalarTypeDefinition
UnionTypeDefinition
2. SchemaClassScanner 尝试通过匹配已知字段上的返回类型/参数类型来发现GraphQL Type->Java类关系
通过 RootQuery 开始进行扫描构建FieldDefinition,并将每个root的field的自定义类型加入到队列中,然后通过队列获取新的Definition进行下一次的扫描
scanResolverInfoForPotentialMatches()->fieldResolver->handleFoundType()->type: TypeDefinition, javaType: JavaType, reference: Reference 三者的关系,将找找到的新类型放入dictionary中->handleNewType->将新类型放入queue中。->scanInterfacesOfType查找类对应的接口->scanQueueItemForPotentialMatches()->scanResolverInfoForPotentialMatches()
3. 将所有相关的架构文件/类传递给解析器后,调用.build()和.makeExecutableSchema()以获取graphql java GraphQLSchema。
4. 构建了GraphQLSchema,可以使用parseSchemaObjects()获取所有已解析的对象。
注意:
如果定义了Type类型,并implements接口,如果此类型没有在任何Query或则Field中使用,系统将会报错。
Object type 'MediaImage' implements a known interface, but no class could be found for that type name. Please pass a class for type 'MediaImage' in the parser's dictionary.
三种解决方案:
1.将此Type删除
2.将此Type应用到Query,或者Field中。
3.在SchemaParserDictionary加入
@Bean public SchemaParserDictionary dictionary() { return new SchemaParserDictionary() .add(MediaImage.class) ; }
相关推荐
Maven 中心的最新构建https ://repo1.maven.org/maven2/com/graphql-java/graphql-java/ 文档GraphQL Java 书籍,来自维护者使用 Java 和 Spring 的 GraphQL请参阅我们的初学者教程GraphQL Java 和 Spring Boot ...
4. **Resolver**: Resolver是GraphQL引擎背后的逻辑,负责解析每个字段的值。当客户端请求一个字段时,对应的Resolver会被调用。 ### graphql-java的关键特性 1. **类型系统**: graphql-java支持GraphQL的完整类型...
graphql-java 解析和执行查询 GraphQL 。它并不真正获取任何数据的:数据来源于执行回调或提供静态数据。graphql-java 的 "hello world":import graphql.schema.GraphQLObjectType; import graphql.schema....
这个`graphql-java,graphql java实现.zip`压缩包很可能包含了一个`graphql-java`项目的源代码,可能是某个开发者或团队的实现版本,命名为`graphql-java-master`,这通常表示它是主分支的源码。 `graphql-java`库的...
在本教程中,我们将探讨如何使用Java和Spring Boot构建一个GraphQL服务器,这将涉及GraphQL Java的基本用法、Schema定义、DataFetcher以及TypeResolver等关键概念。首先,确保你对GraphQL、Spring Boot和Java有一定...
GraphQL Java Servlet我们正在寻找贡献者! 您是否有兴趣改进我们的文档,在代码库上工作,审查PR? 并加入团队! 我们希望您能参与其中! 阅读我们的以获取更多详细信息。总览GraphQL Java Servlet的实现包括开箱即...
GraphQL Java 在我们的讨论中讨论并提出问题: : 这是 Java实现。 文献资料 我们为初学者提供了一个教程: 有关如何使用graphql-java详细信息,请查看文档: : graphql-java 如果您想了解有关新版本和变更日志...
该实现基于受Apollo启发的GraphQL Java库graphql-java-tools。 graphql-java-common -GraphQL实现,它是GraphQL的模式优先实现。 graphql-spring-boot -GraphQL的Sprinb引导启动器。 Spring Boot 2.x 应用该应用...
GraphQL Java implementation. It requires a little Spring and Java knowledge. GraphQL is a query language to retrieve data from a server. It is an alternative to REST, SOAP or gRPC. One very important ...
本文将深入探讨Nuxt.js与GraphQL的整合,并从源码层面进行解析。 1. Nuxt.js简介 Nuxt.js是Vue.js的一个脚手架工具,它简化了Vue.js的SSR流程,使得开发者能够专注于应用的核心逻辑,而不必关心复杂的服务器配置。...
graphql-java的扩展验证 该库为提供了对字段和字段参数的扩展验证 使用 < groupId>com.graphql-java</ groupId> < artifactId>graphql-java-extended-validation < version>16.0.0 < type>pom compile ' ...
综上所述,`graphql-java`是构建Java后端GraphQL服务的强大工具,通过`graphql-java-master`的源码,你可以深入理解其内部机制,并根据需求进行定制和扩展。学习和掌握`graphql-java`,将有助于提升API设计的灵活性...
GraphQL Java Spring地位版本2.0已发布。 我们有一个关于一般性问题的。概述该项目通过启用通过HTTP的查询执行,将集成到Spring / Spring Boot中。 尽管GraphQL规范本身未指定任何传输协议,但描述一种准标准的操作...
受启发,它解析给定的GraphQL模式,并允许您BYOO(带上自己的对象)填写实现。 如果已经有域POJO可以保存数据(例如,用于RPC,ORM,REST等),则GraphQL Java Tools可以很好地工作,方法是允许您将这些“魔术”...
4. **Resolvers**: 在GraphQL中,Resolvers是Data Fetchers的扩展,负责解析特定的字段请求。graphql-java支持通过`GraphQLFieldDefinition`定义Resolvers,使得服务可以根据需求进行精细化控制。 5. **Middleware*...
其次,`graphql-java`提供了一个执行引擎,它可以解析GraphQL查询语句,验证其语法和逻辑,然后根据Schema和Resolvers执行查询并返回结果。这使得GraphQL查询具有强大的灵活性和可扩展性,因为它允许客户端按需获取...
graphql-java-scalars:graphql-java scalar实现 什么是graphql-java-scalars? 这是标量实现的集合。 入门 该库已发布到Maven Central,可以使用常规的依赖项下载机制进行下载。 Maven依赖项是: < groupId>org....
GraphQL-Java批注 是一个很棒的库,但是它的语法有点冗长。 该库为GraphQL模式定义提供了基于注释的语法。 如果您想使用使用graphql-java-annotations创建graphql spring引导服务器的工具,则可以查看库。 目录 ...
GraphQL类型字段(例如,参数化字段)或“解析器”的接口。 GraphQL查询,变异和订阅的客户端请求类。 产品特点 用Java,Kotlin或Scala生成类。 通过文件名模式进行递归模式查找。 根据GraphQL模式或GraphQ
GraphQL:GraphQL字段解析器深入解析.docx