このバージョンはまだ開発中であり、まだ安定しているとは見なされていません。最新の安定バージョンについては、Spring GraphQL 1.3.5 を使用してください! |
フェデレーション
Spring for GraphQL は federation-jvm [GitHub] (英語) ライブラリの統合を提供します。このライブラリは GraphQL Java を使用して、フェデレーションサービスのグラフ内のサブグラフのスキーマを初期化します。詳細については、アポロ連邦 (英語) およびサブグラフの仕様 (英語) を参照してください。
構成
統合を有効にするには、構成で 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 | Declare a DataLoader argument to the @EntityMapping method. |
3 | グラフの残りの部分には @BatchMapping メソッドを使用できます。 |
メソッド署名
エンティティマッピングメソッドは、次の引数をサポートします。
メソッド引数 | 説明 |
---|---|
| 「表現」入力マップから名前付き値にアクセスする場合は、型付きオブジェクトにも変換されます。 |
| エンティティの完全な「表現」入力マップ。 |
| 単一のコントローラーメソッドを使用して特定の型のすべてのエンティティをロードする場合の「表現」入力マップのリスト。 |
|
|
|
|
|
|
| 利用可能な場合、Spring Security コンテキストから取得されます。 |
| Spring Security コンテキストから |
|
|
|
|
| 基礎となる |
| To load federated entities with a |
@EntityMapping
メソッドは Mono
、CompletableFuture
、Callable
、または実際のエンティティを返すことができます。