Vavr Support in Spring Data – Spring Data中的Vavr支持

最后修改: 2017年 7月 14日

1. Overview


In this quick tutorial, we’re going to take a look at the support for Vavr in Spring Data – which was added in the 2.0.0 Spring build snapshot.

在这个快速教程中,我们将看看Spring Data中对Vavr的支持–这是在2.0.0 Spring构建快照中添加的。

More specifically, we’re going to show an example of using Vavr Option and Vavr collections as return types of a Spring Data JPA repository.

更具体地说,我们将展示一个使用Vavr OptionVavr集合作为Spring Data JPA资源库的返回类型的例子。

2. Maven Dependencies


First, let’s setup a Spring Boot project, since it makes configuring Spring Data much quicker, by adding the spring-boot-parent dependency to the pom.xml:

首先,让我们设置一个Spring Boot项目,因为它使配置Spring Data更快,在pom.xml中添加spring-boot-parent依赖。

    <relativePath />

Evidently, we also need the vavr dependency, as well as a few other dependencies for Spring Data and testing:

显然,我们还需要vavr依赖,以及Spring Data和测试的其他几个依赖。


The latest versions of vavr, spring-boot-starter-data-jpa, spring-boot-starter-test and h2 can be downloaded from Maven Central.


In this example, we’re only using Spring Boot because it provides Spring Data auto-configuration. If you are working in a non-Boot project, you can add the spring-data-commons dependency with Vavr support directly:

在这个例子中,我们只使用Spring Boot,因为它提供了Spring Data自动配置。如果你在一个非Boot项目中工作,你可以直接添加有Vavr支持的spring-data-commons依赖项。


3. Spring Data JPA Repository With Vavr

3.Spring Data JPA Repository With Vavr

Spring Data now contains support for defining repository query methods using Vavr‘s Option and Vavr collections: Seq, Set, and Map as return types.

Spring Data现在包含对使用VavrOptionVavr集合定义资源库查询方法的支持。SeqSetMap作为返回类型。

First, let’s create a simple entity class to manipulate:


public class User {

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

    private String name;
    // standard constructor, getters, setters

Next, let’s create the JPA repository by implementing the Repository interface and defining two query methods:


public interface VavrUserRepository extends Repository<User, Long> {

    Option<User> findById(long id);

    Seq<User> findByName(String name);

    User save(User user);

Here, we have made use of Vavr Option for a method returning zero or one results, and Vavr Seq for a query method which returns multiple User records.

在这里,我们使用了Vavr Option来表示一个返回零或一个结果的方法,以及Vavr Seq来表示一个返回多个User记录的查询方法。

We also need a main Spring Boot class to auto-configure Spring Data and bootstrap our application:

我们还需要一个主Spring Boot类来自动配置Spring Data并引导我们的应用程序。

public class Application {
    public static void main(String[] args) {, args);

Since we have added the h2 dependency, Spring Boot will auto-configure a DataSource using an in-memory H2 database.

由于我们添加了h2依赖,Spring Boot将使用内存H2数据库自动配置DataSource

4. Testing the JPA Repository


Let’s add a JUnit test to verify our repository methods:


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

    private VavrUserRepository userRepository;

    public void setup() {
        User user1 = new User();
        User user2 = new User();

    public void whenAddUsers_thenGetUsers() {
        Option<User> user = userRepository.findById(1L);

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

In the above test, we first add two user records to the database, then call the repository’s query methods. As you can see, the methods return the correct Vavr objects.


5. Conclusion


In this quick example, we have shown how we can define a Spring Data repository using Vavr types.

在这个快速的例子中,我们展示了如何使用Vavr类型定义Spring Data资源库。

As always, the full source code can be found over on GitHub.