此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring GraphQL 1.4.1spring-doc.cadn.net.cn

Federation

Spring for GraphQL 为 federation-jvm 库提供了集成,该库使用 GraphQL Java 用于初始化联合服务图中子图的架构。 有关详细信息,请参阅 Apollo FederationSubgraph 规范spring-doc.cadn.net.cn

配置

要启用集成,请声明一个FederationSchemaFactorybean 的 bean 配置,然后插入 它变成GraphQlSource.Builder.例如,使用 Spring Boot:spring-doc.cadn.net.cn

@Configuration
public class FederationConfig {

	@Bean
	public GraphQlSourceBuilderCustomizer customizer(FederationSchemaFactory factory) {
		return builder -> builder.schemaFactory(factory::createGraphQLSchema);
	}

	@Bean
	public FederationSchemaFactory schemaFactory() {
		return new FederationSchemaFactory();
	}
}

现在,子图服务的架构可以扩展联合类型:spring-doc.cadn.net.cn

type Book @key(fields: "id") @extends {
    id: ID! @external
    author: Author
}

type Author {
    id: ID
    firstName: String
    lastName: String
}

@EntityMapping

@EntityMapping方法可以加载联合类型实例以响应来自联合网关的_entities查询。例如:spring-doc.cadn.net.cn

@Controller
private static class BookController {

	@EntityMapping
	public Book book(@Argument int id) { (1)
		// ...
	}

	@SchemaMapping
	public Author author(Book book) { (2)
		// ...
	}

}
1 @Argumentmethod 参数从“表示”输入映射中解析 实体。完整的“表示”输入Map也可以解决。有关支持的内容,请参阅方法签名 method 参数和返回值类型。
2 @SchemaMapping方法可用于图形的其余部分。

您可以通过接受List的 id's, 并返回一个ListFlux实体数量:spring-doc.cadn.net.cn

@Controller
private static class BookController {

	@EntityMapping
	public List<Book> book(@Argument List<Integer> idList) { (1)
		// ... return books in the same order
	}

	@BatchMapping
	public Map<Book, Author> author(List<Book> books) { (2)
		// ...
	}
}
1 idList命名约定有助于将参数名称去复数化,以便 在“表示”输入映射中查找正确的值。您还可以将 参数名称。
2 @BatchMapping方法可用于图形的其余部分。

您可以使用DataLoader:spring-doc.cadn.net.cn

	@Controller
	private static class BookController {

		@Autowired
		public DataLoaderBookController(BatchLoaderRegistry registry) { (1)
			registry.forTypePair(Integer.class, Book.class).registerBatchLoader((bookIds, environment) -> {
				// load entities...
			});
		}

		@EntityMapping
		public Future<Book> book(@Argument int id, DataLoader<Integer, Book> dataLoader) { (2)
			return dataLoader.load(id);
		}

		@BatchMapping
		public Map<Book, Author> author(List<Book> books) { (3)
			// ...
		}
}
1 为联合实体类型注册批处理加载程序。
2 声明一个DataLoader参数设置为@EntityMapping方法。
3 @BatchMapping方法可用于图形的其余部分。

方法签名

实体映射方法支持以下参数:spring-doc.cadn.net.cn

方法参数 描述

@Argumentspring-doc.cadn.net.cn

用于访问“表示”输入映射中的命名值,也转换为类型化对象。spring-doc.cadn.net.cn

Map<String, Object>spring-doc.cadn.net.cn

实体的完整“表示”输入映射。spring-doc.cadn.net.cn

List<Map<String, Object>>spring-doc.cadn.net.cn

使用单个控制器方法加载时的“表示”输入映射列表 给定类型的所有实体。spring-doc.cadn.net.cn

@ContextValuespring-doc.cadn.net.cn

用于从 mainGraphQLContextDataFetchingEnvironment.spring-doc.cadn.net.cn

@LocalContextValuespring-doc.cadn.net.cn

用于从本地访问属性GraphQLContextDataFetchingEnvironment.spring-doc.cadn.net.cn

GraphQLContextspring-doc.cadn.net.cn

要从DataFetchingEnvironment.spring-doc.cadn.net.cn

java.security.Principalspring-doc.cadn.net.cn

从 Spring Security 上下文(如果可用)获取。spring-doc.cadn.net.cn

@AuthenticationPrincipalspring-doc.cadn.net.cn

用于访问Authentication#getPrincipal()来自 Spring Security 上下文。spring-doc.cadn.net.cn

DataFetchingFieldSelectionSetspring-doc.cadn.net.cn

要通过DataFetchingEnvironment.spring-doc.cadn.net.cn

Locale,Optional<Locale>spring-doc.cadn.net.cn

要访问LocaleDataFetchingEnvironment.spring-doc.cadn.net.cn

DataFetchingEnvironmentspring-doc.cadn.net.cn

用于直接访问基础DataFetchingEnvironment.spring-doc.cadn.net.cn

DataLoader<I, E>spring-doc.cadn.net.cn

要使用DataLoader哪里I是 id 类型,并且E是实体类型。spring-doc.cadn.net.cn

@EntityMapping方法可以返回Mono,CompletableFuture,Callable,或实际实体。spring-doc.cadn.net.cn

异常处理

您可以使用@GraphQlExceptionHandler映射异常的方法@EntityMapping方法设置为GraphQLError的。错误将包含在“_entities”查询的响应中。异常处理程序方法可以位于同一控制器中,也可以位于@ControllerAdvice类。spring-doc.cadn.net.cn