Spring GraphQL 1.0.0-M3 版本發布

發布 | Brian Clozel | 2021 年 10 月 28 日 | ...

Spring GraphQL 團隊很高興宣布朝向 1.0.0 版本的第三個里程碑,這是在社群的大力協助下推動的。

批次映射

第二個里程碑引入了帶有 @SchemaMapping 方法的 GraphQL 資料控制器的註解程式設計模型。第三個里程碑新增了一個新的 @BatchMapping 方法。

如果您熟悉 GraphQL,您會知道,如果我們沒有仔細映射物件關係,導覽物件圖可能會導致「N+1 查詢問題」。我們已經可以利用 GraphQL Java 的 批次處理功能來解決這個問題,但此版本引入了 專用支援,以及一個 @BatchMapping 註解,以提供更流暢的體驗

@Controller
public class BookController {

    @BatchMapping
    public Mono<Map<Book, Author>> author(List<Book> books) {
        // ...
    }
}

透過這個範例,我們使用 GraphQL 引擎機制,透過單一呼叫有效地載入許多 Book->Author 關係。

改善的 Querydsl 支援

QuerydslDataFetcher 支援現在會檢查查詢的選取欄位,並且只提取底層網域實體的對應屬性。

TypeResolver

現在 內建支援 GraphQL Unions 和介面的 TypeResolver。 預設情況下,它會嘗試將 Java 類別的簡單名稱與 GraphQL Object 類型進行比對,並且它會嘗試對類別階層中的超類型執行相同的操作。

還有其他選項可以自訂此行為,以提供足夠的提示,將具體的 Java 類別與 GraphQL Object 類型進行比對。 請嘗試這個功能,並告訴我們它的運作情況,或者您是否需要更進一步的彈性。

Input Arguments 的 DataBinder

GraphQL Java 會將輸入引數剖析為一般資料 Map。Spring GraphQL 現在使用 Spring Framework DataBinder 機制,將這些 Map 轉換為在 @Argument 控制器方法參數上宣告的類型化物件。您可以連結 ConversionService 以在 DataBinder 中使用,以便在需要時轉換個別的輸入欄位。

WebSocketInterceptor

現在有一個 WebSocketInterceptorWebInterceptor 的子類型,它也可以處理 WebSocket 連線上的 CONNECTION_INITCOMPLETE 訊息,包括存取 CONNECTION_INIT 酬載,以及拒絕連線的功能。 請試用此功能,並讓我們知道是否需要進一步的功能。

CORS 設定

Spring GraphQL Boot starter 提供 spring.graphql.cors.* 屬性,可為公開的 GraphQL 端點設定 CORS。

GraphQlTester 的查詢檔案

此版本建立在 GraphQlTester API 和測試自動設定之上,以協助您測試 Spring GraphQL 應用程式。

GraphQlTester 現在支援在測試中使用 *.graphql 查詢檔案,作為在 Java 測試類別中撰寫內嵌查詢的替代方法。假設您的測試資源中有一個 projectReleases.graphql 檔案

query projectReleases($slug: ID!) {
    project(slug: $slug) {
        releases {
            version
        }
    }
}

您現在可以在測試中引用此查詢檔案

graphQlTester.queryName("projectReleases") 
        .variable("slug", "spring-framework") 
        .execute()
        .path("project.releases[*].version")
        .entityList(String.class)
        .hasSizeGreaterThan(1);

適用於 IntelliJ 的「JS GraphQL」外掛程式支援具有程式碼完成功能的 GraphQL 查詢檔案。

使用 @GraphQlTest 支援「分割測試」

最後但並非最不重要的一點是,我們現在提供一個新的 @GraphQlTest 測試工具,與 @WebMvcTest@JsonTest Spring Boot 註解非常相似。有了這個,您可以編寫整合測試,這些測試 依賴於應用程式的特定片段。無需載入整個應用程式上下文,僅考慮相關部分,這使得可以輕鬆地模擬和測試,而無需涉及太多的基礎架構。

在此範例中,我們正在測試我們的 BookController,以確保它已正確實作 - 無需設定複雜的資料固件,因為我們可以模擬儲存庫。

@GraphQlTest(controllers = BookController.class)
public class BookControllerTests {

    @Autowired
    private GraphQlTester graphQlTester;

    @MockBean
    private BookRepository bookRepository;

    @Test
    void bookdByIdShouldReturnSpringBook() {
        given(this.bookRepository.findById(42L)).willReturn(new Book(42L, "Spring GraphQL"));
        String query = """
			{
			  bookById(id: "42"){
			    id
			    name
			  }
			}
			""";
        this.graphQlTester.query(query).execute()
                .path("data.bookById.name").entity(String.class).isEqualTo("Spring GraphQL");
    }

}

更多 改進和修正已納入此版本中,並且它們現在可以從 Spring Milestone 儲存庫中的新 Spring GraphQL 1.0.0-M3 中取得。

如何提供協助?

如果您有興趣提供協助,您可以開始使用 Spring GraphQL 並在我們的 GitHub 專案上提出問題。如果您有一般問題,請使用spring-graphql 標籤stackoverflow.com 上提問。

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

取得 Spring 電子報

隨時掌握 Spring 電子報的最新資訊

訂閱

領先一步

VMware 提供培訓和認證,加速您的進展。

了解更多

取得支援

Tanzu Spring 在一個簡單的訂閱中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位檔案。

了解更多

即將到來的活動

查看 Spring 社群中所有即將到來的活動。

查看全部