Spring for GraphQL 2.0.0-M1 釋出

版本釋出 | Brian Clozel | 2025年7月22日 | ...

我很高興地宣佈,Spring for GraphQL 2.0 的第一個里程碑版本現已釋出。這一代構建於 Spring Framework 7.0 之上,並要求相同的基線升級

基線升級

Spring for GraphQL 現在需要 graphql-java 24.0,但我們仍在追蹤即將釋出的 25.0,作為這一代的潛在基線。25.0 版本可能會帶來有趣的功能,包括 在核心引擎中完全支援請求取消

我們遵循 Spring Framework 的步伐,升級到了 Kotlin 2.2.0。同樣,spring-graphql 現在預設使用 Jackson 3.x,但仍然支援 Jackson 2.x 作為回退選項。如果您正在升級您的專案,請檢視 此節,瞭解關於 Jackson 升級的主要更改

新功能

可空性和 JSpecify

我們已將其整個公共 API 應用了 JSpecify 註解。現在這應該有助於 IDE 為您提供一致的警告,避免在生產環境中使用 Spring for GraphQL 時出現 NullPointerExceptions

如果您使用的是 Kotlin 2.1+,此類註解直接內嵌在 Kotlin 型別中並在編譯時使用。spring-graphql 程式碼庫上的可空性檢查將在構建時自動執行。請與我們分享您的升級體驗!

這個第一個里程碑釋出了一些社群請求的新功能。

輸入型別的靈活繫結

您是否曾經遇到過 GraphQL 架構中的型別屬性,其語法與 Java 欄位名不相容,或與您的程式碼風格不一致?例如,一個輸入型別像

input CreateProjectInput {
    id: ID!
    project_slug: String
}

GraphQlArgumentBinder 現在提供了將 GraphQL 引數對映到物件屬性名的選項。您可以提供一個自定義函式來調整模式名稱,使其符合您選擇的樣式。

// configure binding options for GraphQL
var options = GraphQlArgumentBinder.Options.create()
    .nameResolver(name -> toCamelCase(name));

然後,您可以在 AnnotatedControllerConfigurer#setBinderOptions 上設定這些選項。

客戶端輸入的 ArgumentValue

預設情況下,GraphQL 中的輸入型別是可空的且可選的。輸入值(或其任何欄位)可以設定為 null 字面量,或者根本不提供。這種區別對於帶有 mutation 的部分更新很有用,在這種情況下,底層資料也可以設定為 null 或保持不變。

在客戶端,由於 Java 沒有這種 present/null/omitted 的概念,我們無法正確地為 *Input 型別表示這一點。現在,在序列化請求變數時,我們支援輸入型別上的 ArgumentValue<T> 型別。這得益於一個 Jackson 模組,並且 在“Optional input”部分中有記錄

使用 DgsGraphQlClient 進行多查詢

DGS GraphQL 客戶端允許在單個請求中傳送多個查詢,並提供了專用的合同。現在,使用 DgsGraphQlClient 可以實現這一點,因為您可以為單個請求交換鏈式呼叫多個 request()。有關更多資訊,請參閱 參考文件

下一步是什麼?

這只是第一個里程碑,我們還有其他功能正在考慮中。我們還在考慮 GraphQL over HTTP 規範的最新更改,包括 HTTP 294 響應狀態碼用於部分響應

我們正在 我們的 wiki 上整理所有釋出說明;在此期間,請隨時提出您的反饋和增強請求!

2.0.0-M1 現已可從 https://repo.spring.ioMaven Central 獲取。

你如何提供幫助?

如果您有一般性問題,請在 stackoverflow.com 上使用 spring-graphql 標籤提問。

專案頁面 | GitHub | 問題 | 文件 | Stack Overflow

獲取 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

領先一步

VMware 提供培訓和認證,助您加速進步。

瞭解更多

獲得支援

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案,只需一份簡單的訂閱。

瞭解更多

即將舉行的活動

檢視 Spring 社群所有即將舉行的活動。

檢視所有