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 并返回最终的输出值。
相关推荐
在本教程中,我们将探讨如何使用Java和Spring Boot构建一个GraphQL服务器,这将涉及GraphQL Java的基本用法、Schema定义、DataFetcher以及TypeResolver等关键概念。首先,确保你对GraphQL、Spring Boot和Java有一定...
综上所述,`graphql-java`是构建Java后端GraphQL服务的强大工具,通过`graphql-java-master`的源码,你可以深入理解其内部机制,并根据需求进行定制和扩展。学习和掌握`graphql-java`,将有助于提升API设计的灵活性...
4. **Resolvers**: 在GraphQL中,Resolvers是Data Fetchers的扩展,负责解析特定的字段请求。graphql-java支持通过`GraphQLFieldDefinition`定义Resolvers,使得服务可以根据需求进行精细化控制。 5. **Middleware*...
GRPC-Java 源码环境构建 GRPC-Java 源码环境构建是一个相对复杂的过程,需要具备一定的技术基础和经验。本文将详细介绍 GRPC-Java 源码环境构建的步骤和过程,旨在帮助读者快速搭建 GRPC-Java 源码环境。 一、...
ExecutionResult result = graphql.execute(query); ``` 在这个压缩包中,你将会找到相关的Java代码示例,它们详细展示了如何在实际项目中使用阿里云OSS服务和GraphQL技术。通过阅读和运行这些示例,你应该能更好地...
QueryExecution 是 Spark-Sql 源码解析中的一个关键组件,负责执行查询计划。QueryExecution 负责将执行计划转换为可执行的计划,并将其提交给 Spark 集群执行。 Logical Plan 和 SparkPlan 是 Spark-Sql 源码解析...
《制造业MES系统:Java开发深度解析》 MES(Manufacturing Execution System,制造执行系统)是现代制造业中的核心组件,它连接了企业的上层计划管理系统(如ERP)与下层生产设备,实现了生产过程的自动化、信息化...
本文将详细介绍如何查看Java源码,并结合给定的部分内容进行深入解析。 ### 一、准备工作:安装JDK 在阅读Java源码之前,首先需要确保计算机上已经正确安装了Java开发工具包(JDK)。JDK包含了Java编译器、调试器...
【标题】基于Java的MES生产管理系统源码 MES(Manufacturing Execution System)是制造执行系统,主要用于实时监控、控制和优化工厂的生产流程。这个基于Java的MES生产管理系统源码提供了一个全面的解决方案,用于...
Spring GraphQL 是一个专门为基于 GraphQL 的 Spring 应用程序设计的框架,它是在 GraphQL Java 之上的扩展,由 Spring 和 GraphQL Java 团队合作开发。这个框架的目标是减少框架的固有约束,专注于提供全面且广泛的...
源码 sql parser 描述 1.基于 Java8,利用 Antlr4 实现对 sql 的解析并生成解析树 2.基于解析树生成执行计划 3.基于执行计划,对 Java 内存中数据进行操作,对用户透明,并实现部分 sql 执行 4.Java 内存数据为行式...
**AOP技术详解及.java源码解析** AOP(Aspect Oriented Programming,面向切面编程)是软件开发中的一种设计理念,旨在将关注点分离,提高代码的可复用性和可维护性。它允许程序员定义“切面”,这些切面封装了特定...
4. **源码解析**: 深入源码,我们可以学习到如何将图形化设计转换为XML定义,以及如何与工作流引擎进行交互,启动、暂停、恢复和结束流程实例。源码可能包含了工作流状态管理、任务调度和事务处理的相关逻辑。 5....
在.NET中,graphql-dotnet的`DocumentExecuter`类负责执行查询,并返回`ExecutionResult`。执行器会根据Schema解析查询,然后通过执行器实例上的`ExecuteAsync`方法执行解析过程。 对于复杂查询,GraphQL支持突变...
`Command-Execution-Library`是一个这样的工具,它提供了一种简洁的方式,允许开发者在Java源代码中直接执行CMD命令,并获取命令执行的结果。这个库是开源的,意味着它的源代码对公众开放,开发者可以查看、学习甚至...
《Spring AOP源码解析》 Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许我们在不修改原有代码的情况下,插入额外的功能,如日志、事务管理等。本文将深入探讨Spring AOP的概念及其源码实现,帮助...
本项目源码提供了完整的MES系统开发实例,包括JAVA后端和JQUERY前端代码,适合开发者学习和借鉴。通过阅读和理解源码,可以深入了解MES系统的设计思路、架构布局以及具体实现细节。对于Java开发者,可以学习如何利用...
### 解决Java_heap_space问题:深入理解与策略 在Java应用程序开发与运行过程中,经常会遇到一个常见的内存管理问题——“Java heap space”。这个问题通常表现为Java虚拟机(JVM)在执行过程中因可用堆内存不足而...
graphql错误 :warning: 不推荐使用该gem,而建议使用graphql gem中的新GraphQL::Execution::Errors 。 查看更多详细信息 。 这个gem为提供了简单的错误处理。强调每个字段的错误处理。 与Rails类似, rescue_from块...
2. **流程实例和执行上下文**:Flowable Engine通过流程实例(Process Instance)和执行上下文(Execution)跟踪流程状态。流程实例代表一个具体的流程运行实例,而执行上下文则包含了当前流程执行的详细信息。 3. ...