Saltar al contenido principal

Spring Boot 3.1.0-RC1: Service Connections

Spring Boot 3.1.0-RC1 ha sido liberado durante el fin de semana, en Spring Boot 3.1.0-M2: Service Connections mencionamos la introducción de nuevas anotaciones para el manejo de conexiones a servicios externos. En esta versión han habido algunos cambios.

  1. Se ha agregado un nuevo módulo llamado spring-boot-testcontainers que se encarga de crear los beans basados en las implementation de Testcontainers para que puedan ser usados en nuestros tests y en modo desarrollo 👀

  2. @ServiceConnection es la única anotación necesaria para acompañar a @Container y dejar que Spring Boot realice la autoconfiguración de los beans.

Nuestro test ahora quedaría de la siguiente manera:

@Container
@ServiceConnection // (1)
private static final PostgreSQLContainer<?> postgresContainer = new PostgreSQLContainer<>("postgres:12")
        .withCopyFileToContainer(MountableFile.forClasspathResource("schema.sql"), "/docker-entrypoint-initdb.d/schema.sql");
  1. @ServiceConnection hace el mapeo respectivo de las propiedades de Spring Boot con los valores que provee Testcontainers.

Pero eso no es todo, ahora podemos declarar PostgreSQLContainer como @Bean acompañado de @ServiceConnection y Spring Boot se encargará de la autoconfiguración y se puede ejecutar la aplicación. Para esto puedes crear una clase con el método main en src/test/java y ejecutarlo.

public class TestDemoApplication {

    public static void main(String[] args) {
        SpringApplication.from(DemoApplication::main).with(DemoConfiguration.class).run(args);
    }

    @TestConfiguration(proxyBeanMethods = false)
    static class DemoConfiguration {

        @Bean
        @ServiceConnection
        public PostgreSQLContainer<?> redisContainer() {
            PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:12")
                    .withCopyFileToContainer(MountableFile.forClasspathResource("schema.sql"), "/docker-entrypoint-initdb.d/schema.sql");
            return postgres;
        }

        @Bean
        ApplicationRunner runner(JdbcTemplate jdbcTemplate) {
            return args -> {
                jdbcTemplate.queryForList("SELECT name, lastname FROM users")
                        .forEach(System.out::println);
            };
        }

    }

}

Por motivos de pruebas, agrega la siguiente dependencia org.springframework.boot:spring-boot-starter-web a tu pom.xml o build.gradle. La aplicación se ejecutará conectada a una base de datos postgres corriendo en un contenedor.

Ya puedes visitar Spring Initializr y generar un proyecto con Spring Boot 3.1.0-RC1.

Puedes revisar la documentación oficial de Service Connections y en Modo Desarrollo con Testcontainers.

Por cierto, ¿sabías de la existencia de los módulos que provee Testcontainers? Puedes revisarlos en el catálogo de módulos.