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

【GraphQL Java 源码解析】Execution

阅读更多

Spring boot 执行 GraphQL通过 AbstractGraphQLHttpServlet 执行的

GraphQLSchema schema = GraphQLSchema.newSchema()
                .query(queryType)
                .build();

        ExecutionInput executionInput = ExecutionInput.newExecutionInput().query("query { hero { name } }")
                .build();

        GraphQL graphQL = GraphQL.newGraphQL(schema)
                .build();


        ExecutionResult executionResult = graphQL.execute(executionInput);

        Object data = executionResult.getData();
        List<GraphQLError> errors = executionResult.getErrors();

1.  AbstractGraphQLHttpServlet doGet/doPost 标准的servlet

2. HttpRequestHandlerImpl.handle 构建 GraphQLInvocationInput

3. HttpRequestInvokerImpl.execute 

4.GraphQLInvoker.executeAsync 构建 GraphQL

5. GraphQL.executeAsync 构建Execution

6. Execution.execute 构建ExecutionStrategy 

7.ExecutionStrategy.execute 递归调用每个field,如果有子field,会递归调用,并返回每个field的调用结果。

 

for (String fieldName : fieldNames) {
           
            CompletableFuture<FieldValueInfo> future = resolveFieldWithInfo(executionContext, newParameters);
        }

7.1 构建 DataFetchingEnvironment,查找对应的DataFetcher,调用 dataFetcher的get获取每个field的值。

protected fetchField() {
        
        DataFetchingEnvironment environment = newDataFetchingEnvironment(executionContext)
                .source(parameters.getSource())
                .localContext(parameters.getLocalContext())
                .arguments(argumentValues)
                .fieldDefinition(fieldDef)
                .mergedField(parameters.getField())
                .fieldType(fieldType)
                .executionStepInfo(executionStepInfo)
                .parentType(parentType)
                .selectionSet(fieldCollector)
                .queryDirectives(queryDirectives)
                .build();

        DataFetcher<?> dataFetcher = codeRegistry.getDataFetcher(parentType, fieldDef);

       
            Object fetchedValueRaw = dataFetcher.get(environment);
         }

 7.3 完成一次调用,如果时普通的返回类型,则直接跳出,否则 进入 completeValueForObject,递归调用处理孩子的信息

completeValue()  {
       

        if (result == null) {
            fieldValue = completeValueForNull(parameters);
            return FieldValueInfo.newFieldValueInfo(NULL).fieldValue(fieldValue).build();
        } else if (isList(fieldType)) {
            return completeValueForList(executionContext, parameters, result);
        } else if (isScalar(fieldType)) {
            fieldValue = completeValueForScalar(executionContext, parameters, (GraphQLScalarType) fieldType, result);
            return FieldValueInfo.newFieldValueInfo(SCALAR).fieldValue(fieldValue).build();
        } else if (isEnum(fieldType)) {
            fieldValue = completeValueForEnum(executionContext, parameters, (GraphQLEnumType) fieldType, result);
            return FieldValueInfo.newFieldValueInfo(ENUM).fieldValue(fieldValue).build();
        }

        // when we are here, we have a complex type: Interface, Union or Object
        // and we must go deeper
        //
        GraphQLObjectType resolvedObjectType;
        try {
            resolvedObjectType = resolveType(executionContext, parameters, fieldType);
            fieldValue = completeValueForObject(executionContext, parameters, resolvedObjectType, result);
        } catch (UnresolvedTypeException ex) {
           
        }
        return FieldValueInfo.newFieldValueInfo(OBJECT).fieldValue(fieldValue).build();
    }

 7.4 completeValueForObject调用,构建一个新的ExecutionStrategyParameters参数链,并递归调用7.1的流程

 

protected  completeValueForObject() {
       
        ExecutionStrategyParameters newParameters = parameters.transform(builder ->
                builder.executionStepInfo(newExecutionStepInfo)
                        .fields(subFields)
                        .nonNullFieldValidator(nonNullableFieldValidator)
                        .source(result)
        );

        // Calling this from the executionContext to ensure we shift back from mutation strategy to the query strategy.

        return executionContext.getQueryStrategy().execute(executionContext, newParameters);
    }

7.5 构建 ExecutionResult 并返回最终的输出值。

 

0
0
分享到:
评论

相关推荐

    GraphQL Java Practice with Spring Boot

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

    graphql-java.zip

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

    graphql-java,Gracql Java实现.zip

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

    grpc-java源码环境构建.doc

    GRPC-Java 源码环境构建 GRPC-Java 源码环境构建是一个相对复杂的过程,需要具备一定的技术基础和经验。本文将详细介绍 GRPC-Java 源码环境构建的步骤和过程,旨在帮助读者快速搭建 GRPC-Java 源码环境。 一、...

    阿里云OSS以及GraphQL入门Java代码示例.zip

    ExecutionResult result = graphql.execute(query); ``` 在这个压缩包中,你将会找到相关的Java代码示例,它们详细展示了如何在实际项目中使用阿里云OSS服务和GraphQL技术。通过阅读和运行这些示例,你应该能更好地...

    Spark-Sql源码解析

    QueryExecution 是 Spark-Sql 源码解析中的一个关键组件,负责执行查询计划。QueryExecution 负责将执行计划转换为可执行的计划,并将其提交给 Spark 集群执行。 Logical Plan 和 SparkPlan 是 Spark-Sql 源码解析...

    制造业MES源码.rar_MES java_MES源码_java开发制造业_mes java源码_制造

    《制造业MES系统:Java开发深度解析》 MES(Manufacturing Execution System,制造执行系统)是现代制造业中的核心组件,它连接了企业的上层计划管理系统(如ERP)与下层生产设备,实现了生产过程的自动化、信息化...

    怎样看java源码

    本文将详细介绍如何查看Java源码,并结合给定的部分内容进行深入解析。 ### 一、准备工作:安装JDK 在阅读Java源码之前,首先需要确保计算机上已经正确安装了Java开发工具包(JDK)。JDK包含了Java编译器、调试器...

    基于Java的MES生产管理系统源码.zip

    【标题】基于Java的MES生产管理系统源码 MES(Manufacturing Execution System)是制造执行系统,主要用于实时监控、控制和优化工厂的生产流程。这个基于Java的MES生产管理系统源码提供了一个全面的解决方案,用于...

    Spring认证_什么是Spring GraphQL.doc

    Spring GraphQL 是一个专门为基于 GraphQL 的 Spring 应用程序设计的框架,它是在 GraphQL Java 之上的扩展,由 Spring 和 GraphQL Java 团队合作开发。这个框架的目标是减少框架的固有约束,专注于提供全面且广泛的...

    java8源码-sqlParser:使用java和antlr4的sql解析器

    源码 sql parser 描述 1.基于 Java8,利用 Antlr4 实现对 sql 的解析并生成解析树 2.基于解析树生成执行计划 3.基于执行计划,对 Java 内存中数据进行操作,对用户透明,并实现部分 sql 执行 4.Java 内存数据为行式...

    AOP技术的操作步骤说明以及相关的.java源码

    **AOP技术详解及.java源码解析** AOP(Aspect Oriented Programming,面向切面编程)是软件开发中的一种设计理念,旨在将关注点分离,提高代码的可复用性和可维护性。它允许程序员定义“切面”,这些切面封装了特定...

    java 工作流定义 源码

    4. **源码解析**: 深入源码,我们可以学习到如何将图形化设计转换为XML定义,以及如何与工作流引擎进行交互,启动、暂停、恢复和结束流程实例。源码可能包含了工作流状态管理、任务调度和事务处理的相关逻辑。 5....

    dotnet-Facebook的GraphQL在NET中一个实现

    在.NET中,graphql-dotnet的`DocumentExecuter`类负责执行查询,并返回`ExecutionResult`。执行器会根据Schema解析查询,然后通过执行器实例上的`ExecuteAsync`方法执行解析过程。 对于复杂查询,GraphQL支持突变...

    java执行源码-Command-Execution-Library:它是一个库,您可以在其中输入cmd命令并从Java源代码中获取结果值

    `Command-Execution-Library`是一个这样的工具,它提供了一种简洁的方式,允许开发者在Java源代码中直接执行CMD命令,并获取命令执行的结果。这个库是开源的,意味着它的源代码对公众开放,开发者可以查看、学习甚至...

    SpringAOP的源码解析.doc

    《Spring AOP源码解析》 Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许我们在不修改原有代码的情况下,插入额外的功能,如日志、事务管理等。本文将深入探讨Spring AOP的概念及其源码实现,帮助...

    MES 系统JAVA后端 JQUERY前端项目源码

    本项目源码提供了完整的MES系统开发实例,包括JAVA后端和JQUERY前端代码,适合开发者学习和借鉴。通过阅读和理解源码,可以深入了解MES系统的设计思路、架构布局以及具体实现细节。对于Java开发者,可以学习如何利用...

    解决Java_heap_space问题

    ### 解决Java_heap_space问题:深入理解与策略 在Java应用程序开发与运行过程中,经常会遇到一个常见的内存管理问题——“Java heap space”。这个问题通常表现为Java虚拟机(JVM)在执行过程中因可用堆内存不足而...

    graphql-errors:GraphQL Ruby的简单错误处理程序

    graphql错误 :warning: 不推荐使用该gem,而建议使用graphql gem中的新GraphQL::Execution::Errors 。 查看更多详细信息 。 这个gem为提供了简单的错误处理。强调每个字段的错误处理。 与Rails类似, rescue_from块...

    flowable-engine-6.4.0 工作流引擎源码

    2. **流程实例和执行上下文**:Flowable Engine通过流程实例(Process Instance)和执行上下文(Execution)跟踪流程状态。流程实例代表一个具体的流程运行实例,而执行上下文则包含了当前流程执行的详细信息。 3. ...

Global site tag (gtag.js) - Google Analytics