开始使用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首次引入了对Project CRaC(JVM检查点恢复)的初步支持,使应用程序能在JVM重启后恢复其状态,从而增强可靠性和韧性。

安全性方面,SSL Bundle重载功能成为焦点,支持动态重载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依赖。向pom.xml文件添加以下Maven依赖:

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记录类以不可变方式封装了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或更新现有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的强大功能,打造了一个与HarperDB无缝集成的精简Pokemon API。最新版的Spring引入了关键特性,增强了构建健壮且可扩展应用的能力。

通过使用不可变实体、Spring IoC和HarperDB,我们展示了现代Java开发的简便性。示例代码已在此提供,可作为您项目的基石,随时准备进行定制。

欲获取更新及深入见解,请访问官方Spring博客。愿您的Spring Boot与HarperDB之旅充满创新与编程乐趣!愉快编码!

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