![](http://img.szonline.cn/2022/1118/20221118104248143.jpg)
Spring for GraphQL 提供了一個基于注釋的編程模型,其中組件使用注釋來聲明具有靈活方法簽名的處理程序方法 獲取特定 GraphQL 字段的數(shù)據(jù)。例如:??@Controller?
?
(資料圖片)
@Controllerpublic class GreetingController { @QueryMapping public String hello() { return "Hello, world!"; }}
將此方法綁定到查詢,即查詢類型下的字段。 |
如果未在批注中聲明,則根據(jù)方法名稱確定查詢。 |
Spring for GraphQL 用于將上述處理程序方法注冊為名為 “hello” 的查詢。??RuntimeWiring.Builder?
???graphql.schema.DataFetcher?
?
您可以將豆類定義為標準的春豆定義??贪逵∠笤试S自動檢測,與彈簧常規(guī)對齊 支持類路徑上的檢測和類 自動注冊它們的 Bean 定義。它還充當(dāng)注釋的刻板印象 類,指示它在 GraphQL 應(yīng)用程序中作為數(shù)據(jù)獲取組件的角色。??@Controller?
???@Controller?
???@Controller?
???@Component?
?
??AnnotatedControllerConfigurer?
?檢測豆類并注冊其 帶注釋的處理程序方法 ass via。這是一個 可以添加其中的實現(xiàn)。 Spring 引導(dǎo)啟動器自動聲明為 bean 并添加所有豆子,使 支持注釋,請參閱GraphQL 運行時連接部分 在引導(dǎo)啟動器文檔中。??@Controller?
???DataFetcher?
???RuntimeWiring.Builder?
???RuntimeWiringConfigurer?
???GraphQlSource.Builder?
???AnnotatedControllerConfigurer?
???RuntimeWiringConfigurer?
???GraphQlSource.Builder?
???DataFetcher?
?
?@SchemaMapping?
?注釋將處理程序方法映射到 GraphQL 架構(gòu)中的字段 并聲明它是該字段。注釋可以指定 父類型名稱和字段名稱:??@SchemaMapping?
???DataFetcher?
?
@Controllerpublic class BookController { @SchemaMapping(typeName="Book", field="author") public Author getAuthor(Book book) { // ... }}
注釋也可以省略這些屬性,在這種情況下, 字段名稱默認為方法名稱,而類型名稱默認為簡單類 注入到方法中的源/父對象的名稱。例如,下面 默認鍵入“書籍”和字段“作者”:??@SchemaMapping?
?
@Controllerpublic class BookController { @SchemaMapping public Author author(Book book) { // ... }}
可以在類級別聲明注釋以指定默認值 類中所有處理程序方法的類型名稱。??@SchemaMapping?
?
@Controller@SchemaMapping(typeName="Book")public class BookController { // @SchemaMapping methods for fields of the "Book" type}
??@QueryMapping?
?,,和是元注釋 本身帶有注釋,并將“字體名稱”預(yù)設(shè)為 、、 或分別。實際上,這些是快捷方式注釋 分別用于“查詢”、“變更”和“訂閱類型”下的字段。例如:??@MutationMapping?
???@SubscriptionMapping?
???@SchemaMapping?
???Query?
???Mutation?
???Subscription?
?
@Controllerpublic class BookController { @QueryMapping public Book bookById(@Argument Long id) { // ... } @MutationMapping public Book addBook(@Argument BookInput bookInput) { // ... } @SubscriptionMapping public FluxnewPublications() { // ... }}
??@SchemaMapping?
?處理程序方法具有靈活的簽名,可以從一系列 方法參數(shù)和返回值。
架構(gòu)映射處理程序方法可以具有以下任何方法參數(shù):
方法參數(shù) |
描述 |
? |
用于訪問綁定到更高級別類型化對象的命名字段參數(shù)。 看@Argument。 |
? |
對于訪問參數(shù)的原始映射,其中沒有屬性。? |
? |
用于訪問綁定到更高級別、鍵入的 Object 的命名字段參數(shù) 帶有一個標志,用于指示輸入?yún)?shù)是省略還是設(shè)置為。 請參閱參數(shù)值?。? |
? |
用于訪問綁定到更高級別的類型化對象的所有字段參數(shù)。 看@Arguments。 |
? |
用于訪問參數(shù)的原始映射。 |
? |
用于通過項目界面訪問字段參數(shù)。 請參閱@ProjectedPayload界面。 |
“來源” |
用于訪問字段的源(即父/容器)實例。 請參閱??來源??。 |
? |
為了訪問。 請參閱數(shù)據(jù)加載器?。? |
? |
用于從主界面訪問屬性。? |
? |
用于從本地訪問屬性。? |
? |
用于從上下文訪問。? |
? |
從 Spring 安全性上下文(如果可用)獲取。 |
? |
用于從 Spring 安全性上下文訪問。? |
? |
用于訪問用于查詢的選擇集。? |
? |
用于訪問從。? |
? |
用于直接訪問底層證券。? |
架構(gòu)映射處理程序方法可以返回:
任何類型的解析值。??Mono?
?和異步值。支持控制器方法和ReactiveDataFetcher中描述的 anyas。Flux
DataFetcher
??java.util.concurrent.Callable?
?異步生成值。 為此,必須配置一個。AnnotatedControllerConfigurer
Executor
?@Argument?
?在 GraphQL Java 中,提供對特定于字段的映射的訪問 參數(shù)值。這些值可以是簡單的標量值(例如字符串、長整型)、aof 更復(fù)雜輸入的值或 AOF 值。??DataFetchingEnvironment?
???Map?
???List?
?
使用注釋將參數(shù)綁定到目標對象,并且 注入到處理程序方法中。通過將參數(shù)值映射到 預(yù)期方法參數(shù)類型的主數(shù)據(jù)構(gòu)造函數(shù),或使用默認值 構(gòu)造函數(shù),以創(chuàng)建對象,然后將參數(shù)值映射到其屬性。這是 遞歸重復(fù),使用所有嵌套參數(shù)值并創(chuàng)建嵌套目標對象 因此。例如:??@Argument?
?
@Controllerpublic class BookController { @QueryMapping public Book bookById(@Argument Long id) { // ... } @MutationMapping public Book addBook(@Argument BookInput bookInput) { // ... }}
默認情況下,如果方法參數(shù)名稱可用(需要編譯器 標志與 Java 8+ 或編譯器中的調(diào)試信息),它用于查找參數(shù)。 如果需要,您可以通過注釋自定義名稱,例如??-parameters?
???@Argument("bookInput")?
?
注釋沒有“必需”標志,也沒有選項 指定默認值。這兩者都可以在 GraphQL 模式級別指定,并且 由 GraphQL Java 強制執(zhí)行。? |
如果綁定失敗,則引發(fā)綁定問題累積為字段 錯誤,其中每個錯誤都是出現(xiàn)問題的參數(shù)路徑。??BindException?
???field?
?
您可以使用參數(shù),獲得原始地圖 所有參數(shù)值。不得設(shè)置 name 屬性 on。??@Argument?
???Map
???@Argument?
?
?ArgumentValue?
?默認情況下,GraphQL 中的輸入?yún)?shù)可為空且可選,這意味著參數(shù) 可以設(shè)置為文字,也可以根本不提供。這種區(qū)別對于 帶有突變的部分更新,其中基礎(chǔ)數(shù)據(jù)也可能是,設(shè)置為或根本不相應(yīng)地更改。使用時@Argument沒有辦法進行這樣的區(qū)分,因為在這兩種情況下您都會得到一個空。??null?
???null?
???null?
???Optional?
?
如果你不想知道是否根本沒有提供值,你可以聲明一個method參數(shù),它是結(jié)果值的簡單容器, 以及一個標志,用于指示是否完全省略了輸入?yún)?shù)。你 可以使用這個代替,在這種情況下,參數(shù)名稱由 方法參數(shù)名稱,或與一起指定參數(shù)名稱。??ArgumentValue?
???@Argument?
???@Argument?
?
例如:
@Controllerpublic class BookController { @MutationMapping public void addBook(ArgumentValuebookInput) { if (!bookInput.isOmitted()) { BookInput value = bookInput.value(); // ... } }}
??ArgumentValue?
?也支持作為 anMethod 參數(shù)的對象結(jié)構(gòu)中的字段,通過構(gòu)造函數(shù)參數(shù)或通過 setter 初始化,包括 作為嵌套在頂級對象下任何級別的對象的字段。??@Argument?
?
?@Arguments?
?如果要將完整的參數(shù)映射綁定到單個參數(shù)映射上,請使用注釋 目標對象,相反,它綁定特定的命名參數(shù)。??@Arguments?
???@Argument?
?
例如,使用參數(shù)“bookInput”的值 初始化,同時使用完整的參數(shù)映射,并在其中 在這種情況下,頂級參數(shù)綁定到屬性。??@Argument BookInput bookInput?
???BookInput?
???@Arguments?
???BookInput?
?
您可以使用參數(shù),獲得原始地圖 所有參數(shù)值。??@Arguments?
???Map
?
?@ProjectedPayload?
?作為將完整對象與@Argument一起使用的替代方法, 您還可以使用投影接口通過 定義明確,最小的接口。當(dāng) Spring 數(shù)據(jù)位于類路徑上時,參數(shù)投影由Spring Data 的接口投影提供。
要利用這一點,請創(chuàng)建一個注釋為 并聲明的接口 它作為控制器方法參數(shù)。如果參數(shù)用 注釋, 它適用于 Themap 中的單個參數(shù)。當(dāng)聲明沒有時,投影適用于 完整的參數(shù)映射。??@ProjectedPayload?
???@Argument?
???DataFetchingEnvironment.getArguments()?
???@Argument?
?
例如:
@Controllerpublic class BookController { @QueryMapping public Book bookById(BookIdProjection bookId) { // ... } @MutationMapping public Book addBook(@Argument BookInputProjection bookInput) { // ... }}@ProjectedPayloadinterface BookIdProjection { Long getId();}@ProjectedPayloadinterface BookInputProjection { String getName(); @Value("#{target.author + " " + target.name}") String getAuthorAndName();}
在 GraphQL Java 中,提供對源代碼的訪問(即 父/容器)字段實例。要訪問它,只需聲明一個方法參數(shù) 預(yù)期的目標類型。??DataFetchingEnvironment?
?
@Controllerpublic class BookController { @SchemaMapping public Author author(Book book) { // ... }}
源方法參數(shù)還有助于確定映射的類型名稱。 如果 Java 類的簡單名稱與 GraphQL 類型匹配,則無需 在注釋中顯式指定類型名稱。??@SchemaMapping?
?
A@BatchMapping處理程序方法可以批量加載查詢的所有作者, 給定源/父書籍對象的列表。 |
?DataLoader?
?當(dāng)您為實體注冊批處理加載函數(shù)時,如批處理加載中所述,您可以通過聲明 類型的方法參數(shù)并使用它來加載實體:??DataLoader?
???DataLoader?
?
@Controllerpublic class BookController { public BookController(BatchLoaderRegistry registry) { registry.forTypePair(Long.class, Author.class).registerMappedBatchLoader((authorIds, env) -> { // return Map}); } @SchemaMapping public CompletableFuture author(Book book, DataLoader loader) { return loader.load(book.getAuthorId()); }}
默認情況下,使用值類型的完整類名(例如 類名 for) 作為注冊的密鑰,因此只需聲明 具有泛型類型的方法參數(shù)提供了足夠的信息 以在 中找到它。作為回退,方法參數(shù) 解析器還將嘗試將方法參數(shù)名稱作為鍵,但通常不應(yīng) 是必要的。??BatchLoaderRegistry?
???Author?
???DataLoader?
???DataLoaderRegistry?
???DataLoader?
?
請注意,對于許多加載相關(guān)實體的情況,其中簡單的 委托給 A,您可以使用 A@BatchMapping方法減少樣板,如下一節(jié)所述。??@SchemaMapping?
???DataLoader?
?
找到 abean 后,啟用對帶注釋的控制器方法的Bean 驗證支持。通常,Bean 屬于類型。??javax.validation.Validator?
???AnnotatedControllerConfigurer?
???LocalValidatorFactoryBean?
?
Bean 驗證允許您聲明對類型的約束:
public class BookInput { @NotNull private String title; @NotNull @Size(max=13) private String isbn;}
然后,您可以注釋控制器方法參數(shù)以在驗證之前對其進行驗證 方法調(diào)用:??@Valid?
?
@Controllerpublic class BookController { @MutationMapping public Book addBook(@Argument @Valid BookInput bookInput) { // ... }}
如果在驗證過程中發(fā)生錯誤,則會引發(fā) ais 。 可以使用異常解析鏈來決定如何將其呈現(xiàn)給客戶端 通過將其轉(zhuǎn)換為要包含在 GraphQL 響應(yīng)中的錯誤。??ConstraintViolationException?
?
除此之外,您還可以使用Spring的允許 指定驗證組。? |
Bean 驗證對于@Argument、@Arguments和@ProjectedPayload方法參數(shù)很有用,但更普遍地適用于任何方法參數(shù)。
驗證和 Kotlin 協(xié)程 休眠驗證器與 Kotlin 協(xié)程方法不兼容,并且在以下情況下失敗 反省其方法參數(shù)。請參閱spring-projects/spring-graphql#344 (comment)以獲取相關(guān)問題的鏈接和建議的解決方法。 |
?@BatchMapping?
?批量加載通過使用 anto 延遲單個實體實例的加載來解決 N+1 選擇問題,因此它們 可以一起加載。例如:??org.dataloader.DataLoader?
?
@Controllerpublic class BookController { public BookController(BatchLoaderRegistry registry) { registry.forTypePair(Long.class, Author.class).registerMappedBatchLoader((authorIds, env) -> { // return Map}); } @SchemaMapping public CompletableFuture author(Book book, DataLoader loader) { return loader.load(book.getAuthorId()); }}
對于加載關(guān)聯(lián)實體的直接情況,如上所示,該方法只不過是委托給。這是 可以用方法避免的樣板。例如:??@SchemaMapping?
???DataLoader?
???@BatchMapping?
?
@Controllerpublic class BookController { @BatchMapping public Mono
上面成為其中鍵實例中的批量加載函數(shù),加載的值是它們的作者。此外,ais 還透明地綁定到該類型的字段,其中 只是委托給 for 作者,給定其源/父實例。??BatchLoaderRegistry?
???Book?
???DataFetcher?
???author?
???Book?
???DataLoader?
???Book?
?
要用作唯一鍵,必須實現(xiàn)和。? |
默認情況下,字段名稱默認為方法名稱,而類型名稱默認為 輸入元素類型的簡單類名。兩者都可以通過以下方式定制 批注屬性。類型名稱也可以從類級別繼承。??List?
???@SchemaMapping?
?
批處理映射方法支持以下參數(shù):
方法參數(shù) |
描述 |
? |
源/父對象。 |
? |
從 Spring 安全性上下文(如果可用)獲取。 |
? |
為了訪問來自 theof 的值, 這與來自的上下文相同。? |
? |
要從上下文訪問, 這與來自的上下文相同。? |
? |
在 GraphQL Java 中可用的環(huán)境。? |