`
openxtiger
  • 浏览: 151699 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

【GraphQL Java 源码解析】SchemaParser

阅读更多

 一、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)
                ;
    }

 

 

 

 

1
0
分享到:
评论

相关推荐

    GraphQL Java 实现.zip

    Maven 中心的最新构建https ://repo1.maven.org/maven2/com/graphql-java/graphql-java/ 文档GraphQL Java 书籍,来自维护者使用 Java 和 Spring 的 GraphQL请参阅我们的初学者教程GraphQL Java 和 Spring Boot ...

    graphql-java是GraphQL的一个Java实现

    4. **Resolver**: Resolver是GraphQL引擎背后的逻辑,负责解析每个字段的值。当客户端请求一个字段时,对应的Resolver会被调用。 ### graphql-java的关键特性 1. **类型系统**: graphql-java支持GraphQL的完整类型...

    GraphQL的Java实现graphql-java.zip

    graphql-java 解析和执行查询 GraphQL 。它并不真正获取任何数据的:数据来源于执行回调或提供静态数据。graphql-java 的 "hello world":import graphql.schema.GraphQLObjectType; import graphql.schema....

    graphql-java,graphql java实现.zip

    这个`graphql-java,graphql java实现.zip`压缩包很可能包含了一个`graphql-java`项目的源代码,可能是某个开发者或团队的实现版本,命名为`graphql-java-master`,这通常表示它是主分支的源码。 `graphql-java`库的...

    GraphQL Java Practice with Spring Boot

    在本教程中,我们将探讨如何使用Java和Spring Boot构建一个GraphQL服务器,这将涉及GraphQL Java的基本用法、Schema定义、DataFetcher以及TypeResolver等关键概念。首先,确保你对GraphQL、Spring Boot和Java有一定...

    graphql-java-servlet:GraphQL Java的Servlet端点

    GraphQL Java Servlet我们正在寻找贡献者! 您是否有兴趣改进我们的文档,在代码库上工作,审查PR? 并加入团队! 我们希望您能参与其中! 阅读我们的以获取更多详细信息。总览GraphQL Java Servlet的实现包括开箱即...

    graphql-java:GraphQL Java实现

    GraphQL Java 在我们的讨论中讨论并提出问题: : 这是 Java实现。 文献资料 我们为初学者提供了一个教程: 有关如何使用graphql-java详细信息,请查看文档: : graphql-java 如果您想了解有关新版本和变更日志...

    graphql-java-demo:基于Spring Boot Starter的GraphQL Java演示

    该实现基于受Apollo启发的GraphQL Java库graphql-java-tools。 graphql-java-common -GraphQL实现,它是GraphQL的模式优先实现。 graphql-spring-boot -GraphQL的Sprinb引导启动器。 Spring Boot 2.x 应用该应用...

    GraphQL Java

    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-graphql-源码.rar

    本文将深入探讨Nuxt.js与GraphQL的整合,并从源码层面进行解析。 1. Nuxt.js简介 Nuxt.js是Vue.js的一个脚手架工具,它简化了Vue.js的SSR流程,使得开发者能够专注于应用的核心逻辑,而不必关心复杂的服务器配置。...

    graphql-java-extended-validation:graphql-java输入的验证库

    graphql-java的扩展验证 该库为提供了对字段和字段参数的扩展验证 使用 &lt; groupId&gt;com.graphql-java&lt;/ groupId&gt; &lt; artifactId&gt;graphql-java-extended-validation &lt; version&gt;16.0.0 &lt; type&gt;pom compile ' ...

    graphql-java.zip

    综上所述,`graphql-java`是构建Java后端GraphQL服务的强大工具,通过`graphql-java-master`的源码,你可以深入理解其内部机制,并根据需求进行定制和扩展。学习和掌握`graphql-java`,将有助于提升API设计的灵活性...

    graphql-java-spring:GraphQL Java Spring和Spring Boot集成

    GraphQL Java Spring地位版本2.0已发布。 我们有一个关于一般性问题的。概述该项目通过启用通过HTTP的查询执行,将集成到Spring / Spring Boot中。 尽管GraphQL规范本身未指定任何传输协议,但描述一种准标准的操作...

    graphql-java-tools:受js的graphql-tools启发,是针对graphql-java的模式优先工具

    受启发,它解析给定的GraphQL模式,并允许您BYOO(带上自己的对象)填写实现。 如果已经有域POJO可以保存数据(例如,用于RPC,ORM,REST等),则GraphQL Java Tools可以很好地工作,方法是允许您将这些“魔术”...

    graphql-java,Gracql Java实现.zip

    4. **Resolvers**: 在GraphQL中,Resolvers是Data Fetchers的扩展,负责解析特定的字段请求。graphql-java支持通过`GraphQLFieldDefinition`定义Resolvers,使得服务可以根据需求进行精细化控制。 5. **Middleware*...

    graphql-java-master.zip

    其次,`graphql-java`提供了一个执行引擎,它可以解析GraphQL查询语句,验证其语法和逻辑,然后根据Schema和Resolvers执行查询并返回结果。这使得GraphQL查询具有强大的灵活性和可扩展性,因为它允许客户端按需获取...

    graphql-java-scalars:graphql-java标量类型

    graphql-java-scalars:graphql-java scalar实现 什么是graphql-java-scalars? 这是标量实现的集合。 入门 该库已发布到Maven Central,可以使用常规的依赖项下载机制进行下载。 Maven依赖项是: &lt; groupId&gt;org....

    graphql-java-annotations:Java的GraphQL注释

    GraphQL-Java批注 是一个很棒的库,但是它的语法有点冗长。 该库为GraphQL模式定义提供了基于注释的语法。 如果您想使用使用graphql-java-annotations创建graphql spring引导服务器的工具,则可以查看库。 目录 ...

    graphql-java-codegen:使您的GraphQL Java应用程序受模式驱动!

    GraphQL类型字段(例如,参数化字段)或“解析器”的接口。 GraphQL查询,变异和订阅的客户端请求类。 产品特点 用Java,Kotlin或Scala生成类。 通过文件名模式进行递归模式查找。 根据GraphQL模式或GraphQ

    GraphQL:GraphQL字段解析器深入解析.docx

    GraphQL:GraphQL字段解析器深入解析.docx

Global site tag (gtag.js) - Google Analytics