聯合

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 並返回一個實體 ListFlux 來一起載入相同型別的聯合實體

@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 方法可用於圖的其他部分。

方法簽名

實體對映方法支援以下引數

方法引數 描述

@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>

使用 DataLoader 載入聯合實體,其中 I 是 ID 型別,E 是實體型別。

@EntityMapping 方法可以返回 MonoCompletableFutureCallable 或實際實體。

異常處理

您可以使用 @GraphQlExceptionHandler 方法將來自 @EntityMapping 方法的異常對映到 GraphQLError。這些錯誤將包含在“_entities”查詢的響應中。異常處理方法可以位於同一控制器中,也可以位於 @ControllerAdvice 類中。

© . This site is unofficial and not affiliated with VMware.