Suporte do Vavr nos dados do Spring

Suporte do Vavr nos dados do Spring

*1. Visão geral *

Neste tutorial rápido, veremos o suporte para Vavr em Spring Data –, que foi adicionado no instantâneo de construção 2.0.0 Spring.

Mais especificamente, mostraremos um exemplo do uso das coleções Vavr Option e Vavr como tipos de retorno de um repositório Spring Data JPA.

===* 2. Dependências do Maven *

Primeiro, vamos configurar um projeto Spring Boot, pois torna a configuração de Spring Data muito mais rápida, adicionando a dependência spring-boot-parent ao pom.xml:

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

Evidentemente, também precisamos da dependência vavr, bem como de algumas outras dependências para Spring Data e teste:

<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>

As versões mais recentes de https://search.maven.org/classic/search%7Cga%7C1%7Ca%3A%22vavr%22%20AND%20g%3A%22io.vavr%22[vavr], spring-boot-starter-data-jpa, https://search.maven. org/classic/ search% 7Cga% 7C1% 7Ca% 3A% 22spring-boot-starter-test% 22% 20AND% 20g% 3A% 22org.springframework.boot% 22 [spring-boot-starter-test] e h2 pode ser baixado do Maven Central.

Neste exemplo, estamos usando apenas o Spring Boot porque ele fornece a configuração automática de Spring Data. Se você estiver trabalhando em um projeto que não seja Boot, poderá adicionar a dependência spring-data-commons com o suporte Vavr diretamente:

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

===* 3. Spring Data JPA Repositório com Vavr *

Spring Data agora contém suporte para definir métodos de consulta de repositório usando Vavr‘s Option e Vavr coleções: Seq, Set e Map como tipos de retorno.

Primeiro, vamos criar uma classe de entidade simples para manipular:

@Entity
public class User {

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

    private String name;

   //standard constructor, getters, setters
}

Em seguida, vamos criar o repositório JPA implementando a interface Repository e definindo dois métodos de consulta:

public interface VavrUserRepository extends Repository<User, Long> {

    Option<User> findById(long id);

    Seq<User> findByName(String name);

    User save(User user);
}

Aqui, usamos Vavr Option para um método que retorna zero ou um resultado, e Vavr Seq para um método de consulta que retorna vários registros de User.

Também precisamos de uma classe principal Spring Boot para configurar automaticamente Spring Data e inicializar nosso aplicativo:

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

Como adicionamos a dependência h2, o Spring Boot configura automaticamente um DataSource usando um banco de dados H2 na memória.

===* 4. Testando o repositório JPA *

Vamos adicionar um teste JUnit para verificar nossos métodos de repositório:

@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());
    }
}

No teste acima, primeiro adicionamos dois registros de usuário ao banco de dados e depois chamamos os métodos de consulta do repositório. Como você pode ver, os métodos retornam os objetos Vavr corretos.

===* 5. Conclusão*

Neste exemplo rápido, mostramos como podemos definir um repositório Spring Data usando Vavr types.

Como sempre, o código fonte completo pode ser encontrado em over no GitHub.