聯合
Spring for GraphQL 為 federation-jvm 庫提供整合,該庫使用 GraphQL Java 初始化聯合服務圖中的子圖模式。詳見 Apollo Federation 和 子圖規範。
配置
要啟用整合,請在配置中宣告一個 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 方法可用於圖的其他部分。 |
您可以透過接受一個 ID List 並返回一個實體 List 或 Flux 來一起載入相同型別的聯合實體
@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 載入聯合實體
@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 Security 上下文獲取。 |
|
用於從 Spring Security 上下文訪問 |
|
透過 |
|
用於從 |
|
直接訪問底層的 |
|
使用 |
@EntityMapping 方法可以返回 Mono、CompletableFuture、Callable 或實際實體。