Перейти к основному содержимому

Поддержка Vavr в данных Spring

· 3 мин. чтения

1. Обзор

В этом кратком руководстве мы рассмотрим поддержку Vavr в Spring Data , которая была добавлена в моментальный снимок сборки 2.0.0 Spring.

В частности, мы собираемся показать пример использования Vavr Option и коллекций Vavr в качестве возвращаемых типов репозитория Spring Data JPA .

2. Зависимости Maven

Во-первых, давайте настроим проект Spring Boot , так как он значительно ускоряет настройку данных Spring , добавив зависимость spring-boot-parent в pom.xml :

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.1</version>
<relativePath />
</parent>

Очевидно, нам также нужна зависимость 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 . Если вы работаете в проекте, отличном от Boot , вы можете напрямую добавить зависимость spring-data-commons с поддержкой Vavr :

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

3. Репозиторий Spring Data JPA с Vavr

Spring Data теперь содержит поддержку для определения методов запроса репозитория с использованием коллекций Vavr Option и Vavr : Seq , Set и Map в качестве возвращаемых типов.

Во-первых, давайте создадим простой класс сущности для управления:

@Entity
public class User {

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

private String name;

// standard constructor, getters, setters
}

Далее давайте создадим репозиторий 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 для метода запроса, который возвращает несколько пользовательских записей.

Нам также нужен основной класс Spring Boot для автоматической настройки Spring Data и начальной загрузки нашего приложения:

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

Поскольку мы добавили зависимость h2 , Spring Boot автоматически настроит источник данных , используя базу данных H2 в памяти .

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. Вывод

В этом кратком примере мы показали, как мы можем определить репозиторий Spring Data , используя типы Vavr .

Как всегда, полный исходный код можно найти на GitHub .