フェデレーション

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 メソッドを使用できます。

@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)
		// ...
	}
}
1idList 命名規則は、パラメーター名の複数形を解除して、「表現」入力マップで正しい値を検索できます。また、アノテーションを通じて引数名を設定することもできます。
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 メソッドは MonoCompletableFutureCallable、または実際のエンティティを返すことができます。

例外処理

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