联邦

Spring for GraphQL 提供了对 federation-jvm 库的集成,该库使用 GraphQL Java 在联邦服务的图中初始化子图的模式。有关详细信息,请参阅 Apollo 联邦子图规范

配置

要启用集成,请在您的配置中声明一个 `FederationSchemaFactory` bean,并将其插入 `GraphQlSource.Builder`。例如,使用 Spring Boot

@Configuration
public class FederationConfig {

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

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

现在子图服务的模式可以扩展联邦类型

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

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

`@EntityMapping`

一个 `@EntityMapping` 方法可以响应来自联邦网关的 _entities 查询 来加载联邦类型实例。例如

例如

@Controller
private static class BookController {

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

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

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

一个 `@EntityMapping` 方法可以批量加载给定类型的联邦实体。为此,请将 `@Argument` 方法参数声明为列表,并按相同的顺序返回相应的实体实例作为列表。

例如

@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` 方法可用于图的其余部分。

方法签名

实体映射方法支持以下参数

方法参数 描述

@Argument

用于访问来自“表示”输入映射的命名值,也转换为类型化对象。

Map<String, Object>

实体的完整“表示”输入映射。

List<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` 方法可以返回 `Mono`、`CompletableFuture`、`Callable` 或实际实体。

异常处理

您可以使用 `@GraphQlExceptionHandler` 方法将 `@EntityMapping` 方法中的异常映射到 `GraphQLError`。错误将包含在“_entities”查询的响应中。异常处理程序方法可以在同一个控制器中,也可以在 `@ControllerAdvice` 类中。