Federation

适用于 GraphQL 的 Spring 为 federation-jvm 库提供了一个小型集成层,该库又建立在 GraphQL Java 之上,并有助于为联邦图中的子图的 GraphQL Java 应用程序初始化 graphql.schema.GraphQLSchema。有关详细信息,请参见 Apollo FederationSubgraph spec

要使用这项支持,您可以在配置中声明一个 FederationSchemaFactory Bean,并将其插入 GraphQlSource.Builder。在 Spring Boot 应用程序中,您可以通过 GraphQlSourceBuilderCustomizer 按照如下方式进行操作:

@Configuration
public class FederationConfig {

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

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

}

现在,您的子图模式可以扩展联合类型:

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

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

要帮助解决作为 _entities 查询一部分的联邦类型,您可以将 @EntityMapping 方法与 @SchemaMapping 方法并排用于子图应用程序拥有的数据。例如:

@Controller
private static class BookController {

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

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

}

@Argument 方法参数从实体的 “representation” 输入映射中解析。您还可以注入完整 Map<String, Object>。下面显示了所有受支持的参数:

Method Argument Description

@Argument

对于从 "表示" 输入图中访问命名值,也转换为类型的对象。

Map<String, Object>

实体的完整 "表示" 输入图。

@ContextValue

对于从 DataFetchingEnvironment 中的 GraphQLContext 访问属性。

@LocalContextValue

对于从 DataFetchingEnvironment 中的 GraphQLContext 访问属性。

GraphQLContext

对于从 DataFetchingEnvironment 访问上下文。

java.security.Principal

从 Spring Security 上下文中获取,如果可用。

@AuthenticationPrincipal

对于从 Spring Security 上下文中访问 Authentication#getPrincipal()

DataFetchingFieldSelectionSet

对于通过 DataFetchingEnvironment 访问查询的选择集。

Locale, Optional<Locale>

对于从 DataFetchingEnvironment 访问 Locale

DataFetchingEnvironment

对于直接访问底层 DataFetchingEnvironment

@EntityMapping 方法可以返回 MonoCompletableFutureCallable 或实际实体。

你可以使用 @GraphQlExceptionHandler 方法来将 @EntityMapping 方法中的异常映射到 GraphQLError’s 。这些错误将包含在“_entities”查询的响应中。异常处理程序方法可以位于同一控制器中,或位于 `@ControllerAdvice 类中。