Boot Spring 3.2.0 入門:打造整合 NoSQL 的 Hello World REST API

踏上探索最新Spring Boot開發技術的旅程,版本3.2.0將引領您從建立基本的”Hello World”應用程式開始。在本教程中,我們不僅僅介紹Spring的常規入門,更深入探討如何構建REST API並與NoSQL資料庫無縫整合。Spring Boot 3.2.0憑藉其眾多新功能與優化,為探索現代開發實踐提供了引人入勝的舞台。本指南適合初學者與經驗豐富的開發者,承諾提供實際操作經驗,讓您充分利用Spring打造強大而現代的應用程式。讓我們開始這段Spring 3.2.0的旅程,見證簡約與創新的完美結合。

Spring Boot 3.2.0有哪些新特性

Spring Boot 3.2.0在Java開發領域邁出了重要的一步,要求最低Java 17環境,並擴展支援至前沿的Java 21。此版本引入了許多重新定義Spring框架使用方式的特點。

Java的顯著特點之一是支援虛擬線程,透過利用輕量級線程提升可擴展性和響應性。此外,Spring Boot 3.2.0首次引入專案CRaC(JVM檢查點恢復)的初步支援,使應用程式能在JVM重啟後恢復狀態,從而增強了可靠性和韌性。

安全性方面,SSL Bundle Reloading功能成為焦點,允許動態重新載入SSL配置,賦予開發者更動態地管理SSL證書的能力,確保應用程式的靈活性和安全性。

可觀測性的提升貫穿整個版本,為開發者提供增強的監控和追蹤功能,帶來更透明且易於管理的開發體驗。

遵循現代開發實踐,Spring Boot 3.2.0推出了專門用於RESTful(RestClient)和JDBC(JdbcClient)操作的客戶端,簡化與外部服務的通訊,增強整合能力。

Jetty 12的兼容性是另一大亮點,讓開發者能利用Jetty網頁伺服器的最新特性。Spring Boot 3.2.0還擴展了其生態系統的兼容性,新增對Apache Pulsar的支援,拓寬Spring的事件驅動應用建構中的訊息功能。

承認Kafka和RabbitMQ的普及,Spring Boot 3.2.0為這些受歡迎的訊息系統引入了SSL捆綁支援,加強了依賴這些訊息代理的應用程式的安全態勢。

此版本還解決了依賴管理複雜性,採用重新設計的方法來處理嵌套JAR,確保應用程式部署更加可靠和可預測。最後,Docker映像構建得到改進,簡化了容器化過程,增強了Spring應用程式的可移植性和部署效率。

總結來說,Spring Boot 3.2.0與最新的Java版本保持一致,引入了突破性的功能,並改進了現有能力。此版本賦能開發者自信地構建現代、彈性且高性能的應用程式,在Java開發不斷演進的景觀中。

展示代碼

在本節中,我們將展開一個激動人心的旅程,開發一個Pokemon API,利用Spring的力量,並與HarperDB無縫整合。我們的重點將放在實現基本的CRUD(建立、讀取、更新、刪除)操作,特別強調利用每個Pokemon的唯一識別符(ID)。到本節結束時,您不僅將擁有一個完全功能的Spring應用程式,還將擁有一個可供使用的Pokemon API,隨時可以擴展並整合到更大的專案中。讓我們深入Pokemon和Spring開發的世界,在那裡簡單與創新相遇。

確保您的NoSQL資料庫HarperDB使用Docker運行。打開您的終端並執行以下命令:

Shell

 

docker run -d -e HDB_ADMIN_USERNAME=root -e HDB_ADMIN_PASSWORD=password -e HTTP_THREADS=4 -p 9925:9925 -p 9926:9926 harperdb/harperdb

此命令會拉取HarperDB的Docker映像並使用指定的配置啟動一個容器。-p選項將容器的端口映射到本地機器,使得HarperDB界面可以在http://localhost:9925訪問。

前往Spring Initializer設置我們的Spring應用程序。請遵循以下步驟:

  1. 選擇所需項目設置(例如,Maven或Gradle,Java版本)。
  2. 添加依賴:從依賴列表中選擇“Spring Web”。
  3. 點擊“Generate”以下載項目ZIP文件。

解壓已下載的ZIP文件,並將項目導入您偏好的集成開發環境(IDE),如IntelliJ IDEA或Eclipse。

現在我們的Spring應用程序已設置完畢,下一步是將其與HarperDB集成。為此,我們必須在項目中包含HarperDB依賴。將以下Maven依賴添加到您的pom.xml文件中:

XML

 

<dependency>
    <groupId>io.harperdb</groupId>
    <artifactId>harpderdb-core</artifactId>
    <version>0.0.1</version>
</dependency>

依賴就緒後,我們接著編寫代碼。我們將在Spring中創建一個配置類HarperDB,用於管理連接並使其成為Spring控制反轉(IoC)容器的一部分:

Java

 

@Configuration
public class HarperDB {

    @Bean
    public Template template() {
        Server server = ServerBuilder.of("http://localhost:9925")
                .withCredentials("root", "password");
        server.createDatabase("pokemons");
        server.createTable("pokemon").id("id").database("pokemons");
        return server.template("pokemons");
    }
}

此配置類別,標註有@Configuration,創建了一個名為template的Spring bean。Template物件是與HarperDB互動的關鍵組件。我們使用伺服器連接詳情初始化它,包括伺服器URL和登入憑證。此外,我們創建了一個名為“pokemons”的資料庫和一個名為“pokemon”的表格,其中包含一個“id”欄位。這為我們在HarperDB中儲存Pokemon實體奠定了基礎。

為了增強演示,我們將首先使用Java的record特性創建一個不可變實體:

Java

 

public record Pokemon(String id, String name, String location) {
}

這個簡單的Pokemon record類封裝了Pokemon的基本屬性——其ID、名稱和位置——以不可變方式。

接下來,讓我們通過創建PokemonService與資料庫建立通訊,作為通往HarperDB的橋樑:

Java

 

@Service
public class PokemonService {

    private final Template template;

    public PokemonService(Template template) {
        this.template = template;
    }

    public Optional<Pokemon> findById(String id) {
        return template.findById(Pokemon.class, id);
    }

    public void save(Pokemon pokemon) {
        template.upsert(pokemon);
    }

    public void delete(String id) {
        template.delete(Pokemon.class, id);
    }
}

PokemonService類別是一個Spring服務,處理與Pokemon實體相關的基本操作。它利用我們先前配置的Template物件與HarperDB互動。findById方法通過其ID檢索Pokemon,保存添加或更新Pokemon,並從資料庫中刪除並移除它。

最後,讓我們創建PokemonController,將這些操作作為REST端點公開:

Java

@RestController
public class PokemonController {

    private final PokemonService service;

    public PokemonController(PokemonService service) {
        this.service = service;
    }

    @GetMapping("/pokemons/{id}")
    Pokemon findById(@PathVariable String id) {
        return service.findById(id).orElseThrow(() -> new PokemonNotFoundException(id));
    }

    @PutMapping("/pokemons")
    Pokemon newPokemon(@RequestBody Pokemon pokemon) {
        service.save(pokemon);
        return pokemon;
    }

    @DeleteMapping("/pokemons/{id}")
    void deleteEmployee(@PathVariable String id) {
        service.delete(id);
    }
}

此PokemonController類別標註有@RestController,並定義了三個端點:

  • GET /pokemons/{id}通過其ID檢索Pokemon。
  • PUT /pokemons創建新的Pokemon或更新現有的一個。
  • DELETE /pokemons/{id}通過其ID刪除Pokemon。

控制器依賴於PokemonService來處理這些操作,為我們的Spring應用程序提供了清晰的職責分離。

有了這些組件,我們的Pokemon API可以使用HarperDB執行基本的CRUD操作。歡迎測試端點,親眼見證Spring與NoSQL數據庫的無縫集成!

您的Spring應用程序,集成HarperDB並配備了Pokemon API,現已準備好進行測試和執行。讓我們使用curl命令探索一些常見場景。在繼續之前,請確保您的Spring應用程序正在運行。

創建一個Pokemon

Shell

 

   curl -X PUT -H "Content-Type: application/json" -d '{"id": "1", "name": "Pikachu", "location": "Forest"}' http://localhost:8080/pokemons

此命令創建一個新Pokemon,ID為1,名稱為Pikachu,位置為Forest。

通過ID檢索Pokemon

Shell

 

curl http://localhost:8080/pokemons/{id}

{id}替換為您剛創建的Pokemon的實際ID。

更新Pokemon

Shell

 

   curl -X PUT -H "Content-Type: application/json" -d '{"id": "1", "name": "Raichu", "location": "Thunderstorm"}' http://localhost:8080/pokemons

此命令將ID為1的現有Pokemon的名稱更新為Raichu,位置更新為Thunderstorm。

通過ID刪除Pokemon

Shell

 

curl -X DELETE http://localhost:8080/pokemons/{id}

{id}替換為您想要刪除的Pokemon的實際ID。

這些場景全面測試了您的Pokemon API中的基本CRUD操作,從創建Pokemon開始。根據您的具體用例和數據調整命令。祝測試愉快!

結論

在本教程中,我們利用Spring Boot 3.2.0的功能打造了一個精簡的Pokemon API,並與HarperDB無縫整合。最新版的Spring引入了關鍵特性,增強了我們創建彈性和可擴展應用程式的能力。

通過使用不可變實體、Spring IoC和HarperDB,我們展示了現代Java開發的簡潔性。示範代碼可在此獲取,為您的項目提供了一個基礎,隨時可以進行定制。

如需更新和深入見解,請參閱官方Spring博客。願您的Spring Boot和HarperDB之旅充滿創新與編碼的喜悅!祝編碼愉快!

Source:
https://dzone.com/articles/getting-started-with-boot-spring-320-building-a-he