1. 概述
本文快速介绍 Spring Data 对 Vavr 的支持功能——该特性在 Spring 2.0.0 快照版本中首次引入。
我们将通过具体示例,展示如何在 Spring Data JPA 仓库中使用 Vavr Option 和 Vavr 集合作为返回类型。
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>
最新版 vavr、spring-boot-starter-data-jpa、spring-boot-starter-test 和 h2 可从 Maven Central 下载。
⚠️ 本示例使用 Spring Boot 仅因其提供 Spring Data 自动配置。若在非 Boot 项目中,可直接添加支持 Vavr 的 spring-data-commons 依赖:
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-commons</artifactId> <version>2.0.0.RELEASE</version> </dependency>
3. 集成 Vavr 的 Spring Data JPA 仓库
Spring Data 现已支持使用 Vavr 的 Option 和集合类型(Seq、Set、Map)定义仓库查询方法的返回类型。
首先创建一个简单的实体类:
@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());
}
}
测试流程:
- 向数据库插入两条用户记录
- 调用仓库查询方法
- ✅ 验证方法返回正确的 Vavr 对象
5. 总结
本文通过简单示例展示了如何使用 Vavr 类型定义 Spring Data 仓库。这种集成能有效减少空指针异常风险,同时提供更丰富的集合操作能力。
完整源码见 GitHub 项目。