1. 概述

本文快速介绍 Spring Data 对 Vavr 的支持功能——该特性在 Spring 2.0.0 快照版本中首次引入。

我们将通过具体示例,展示如何在 Spring Data JPA 仓库中使用 Vavr OptionVavr 集合作为返回类型。

2. Maven 依赖

首先搭建 Spring Boot 项目,它能极大简化 Spring Data 的配置。在 pom.xml 中添加 spring-boot-parent 依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
</dependency>

显然还需要 vavr 依赖,以及 Spring Data 和测试相关的其他依赖:

<dependency>
    <groupId>io.vavr</groupId>
    <artifactId>vavr</artifactId>
    <version>0.9.0</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
</dependency>

最新版 vavrspring-boot-starter-data-jpaspring-boot-starter-testh2 可从 Maven Central 下载。

⚠️ 本示例使用 Spring Boot 仅因其提供 Spring Data 自动配置。若在非 Boot 项目中,可直接添加支持 Vavrspring-data-commons 依赖:

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-commons</artifactId>
    <version>2.0.0.RELEASE</version>
</dependency>

3. 集成 VavrSpring Data JPA 仓库

Spring Data 现已支持使用 VavrOption 和集合类型(SeqSetMap)定义仓库查询方法的返回类型。

首先创建一个简单的实体类:

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    private String name;
    
    // 标准构造器、getter/setter
}

接着通过实现 Repository 接口创建 JPA 仓库,并定义两个查询方法:

public interface VavrUserRepository extends Repository<User, Long> {

    Option<User> findById(long id);

    Seq<User> findByName(String name);

    User save(User user);
}

这里我们:

  • Vavr Option 处理返回零或一个结果的场景
  • Vavr Seq 处理返回多个 User 记录的查询

最后创建主 Spring Boot 类以自动配置 Spring Data 并启动应用:

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

由于添加了 h2 依赖,Spring Boot 会自动配置基于内存 H2 数据库的 DataSource

4. 测试 JPA 仓库

添加 JUnit 测试验证仓库方法:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class VavrRepositoryIntegrationTest {

    @Autowired
    private VavrUserRepository userRepository;

    @Before
    public void setup() {
        User user1 = new User();
        user1.setName("John");
        User user2 = new User();
        user2.setName("John");

        userRepository.save(user1);
        userRepository.save(user2);
    }

    @Test
    public void whenAddUsers_thenGetUsers() {
        Option<User> user = userRepository.findById(1L);
        assertFalse(user.isEmpty());
        assertTrue(user.get().getName().equals("John"));

        Seq<User> users = userRepository.findByName("John");
        assertEquals(2, users.size());
    }
}

测试流程:

  1. 向数据库插入两条用户记录
  2. 调用仓库查询方法
  3. ✅ 验证方法返回正确的 Vavr 对象

5. 总结

本文通过简单示例展示了如何使用 Vavr 类型定义 Spring Data 仓库。这种集成能有效减少空指针异常风险,同时提供更丰富的集合操作能力。

完整源码见 GitHub 项目


原始标题:Vavr (ex-Javaslang) Support in Spring Data

» 下一篇: Chronicle Queue 介绍