このバージョンはまだ開発中であり、まだ安定しているとは見なされていません。最新の安定バージョンについては、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)
		// ...
	}
}
1idList 命名規則は、パラメーター名の複数形を解除して、「表現」入力マップで正しい値を検索できます。また、アノテーションを通じて引数名を設定することもできます。
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 フェデレーションエンティティ型用のバッチローダーを登録します。
2Declare a DataLoader argument to the @EntityMapping method.
3 グラフの残りの部分には @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 への直接アクセス用。

DataLoader<I, E>

To load federated entities with a DataLoader where I is the id type, and E is the entity type.

@EntityMapping メソッドは MonoCompletableFutureCallable、または実際のエンティティを返すことができます。

例外処理

@GraphQlExceptionHandler メソッドを使用して、@EntityMapping メソッドの例外を GraphQLError メソッドにマップできます。エラーは "_entities" クエリのレスポンスに含まれます。例外ハンドラーメソッドは、同じコントローラー内または @ControllerAdvice クラス内に存在できます。