Federation

Spring for GraphQL 為 federation-jvm 程式庫提供整合,該程式庫使用 GraphQL Java 初始化聯邦服務圖中的子圖架構。詳情請參閱 Apollo FederationSubgraph 規格

設定

若要啟用整合,請在您的設定中宣告 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 方法參數是從實體的 "representation" 輸入映射解析而來。完整的 "representation" 輸入 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 命名慣例有助於將參數名稱去複數化,以便在 "representation" 輸入映射中查找正確的值。您也可以透過註解設定引數名稱。
2 @BatchMapping 方法可用於圖表的其餘部分。

方法簽章

實體映射方法支援下列引數

方法引數 描述

@Argument

用於存取 "representation" 輸入映射中的具名值,也會轉換為具類型物件。

Map<String, Object>

實體的完整 "representation" 輸入映射。

List<Map<String, Object>>

當使用單一控制器方法載入給定類型的所有實體時,"representation" 輸入映射的列表。

@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 類別中。