Entradas

JPA-Hibernate + POJO + Projection + ConstructorResult + NativeQuery + Testcontainers + PostgreSQL

Imagen
En esta ocasión mostraré un ejemplo usando Java SE 11 de como mapear una clase no entidad (un POJO) a partir de los datos que existen en la base de datos y que representan a una entidad utilizando ConstructorResult, Projection y una construcción "manual" con JPA. Las pruebas serán realizadas usando Testcontainers junto a Postgresql como base de datos. El procedimiento es el siguiente (se omiten los metodos/imports/anotaciones que no son relevantes y usaré lombok solo para getter/setter): 1- La Entidad Representa la entidad que mantendrá datos en la base de datos y de la cual extraeremos algunos de sus campos para nuestro pojo. @Entity @Table(schema = "jpa", name = "persona") public class Persona { @Id private int id; private String nombre; private String apellido; } 2- El POJO Requiere tener un constructor con los argumentos que la query utilizará: public class PersonaPOJO { private String nn; private String a...

Redis Streams: xadd + xread

Esta ocasión mostraré un ejemplo de Redis Streams , con los metodos xadd y xread utilizando la librería Lettuce .  Generar Mensajes El Stream tendrá el nombre mensajes y cada mensaje enviado tendrá un UUID y un número indicando la cantidad de mensajes enviados: final var cliente = RedisClient.create("redis://localhost:6379"); try (final var con = cliente.connect()) { final var cmd = con.sync(); int i = 0; while (i < 500_000) { final var res = cmd.xadd("mensajes", Map.of(UUID.randomUUID().toString(), String.valueOf(i))); i++; LOGGER.info("enviados: {} - id: {}", i, res); Thread.sleep(1_000); } } cliente.shutdown();  Recibir Mensajes El cliente lee un mensaje a la vez y recuerda el último ID leido para preguntar por los nuevos mensajes y se bloquea 5 segundos esperando mensajes: final var cliente = RedisClient.crea...

Spring Boot + Spring Security + React + Keycloak

Imagen
Ahora mostraré como utilizar Spring Boot , Spring Security y Keycloak para tener recursos protegidos accediendo a ellos utilizando React 😉. Configurar Keycloak Configurar Spring Boot Configurar React   Keycloak Keycloak se puede obtener utilizando docker o desde su página como Standalone server distribution (previamente en este enlace había indicado como obtenerlo y lanzarlo).  Luego de lanzarlo estará disponible localmente y procedemos a realizar su configuración (en mi caso visitando http://localhost:8282/): Si es la primera vez configuramos el usuario administrador. Una vez ingresado entramos a la aplicación: Seleccionamos Add realm y definimos su nombre, en este ejemplo es: sso Luego vamos a Clients y presionamos Create para agregar dos clientes: cliente-uno para Spring Boot y cliente-dos para React, en ambos definimos su Root URL y Web Origins (NO olvidar presionar el boton save cuando realizamos modificaciones, web ...

Spring Boot con Redis para almacenar JSON y no la serialización predefinida

Imagen
En esta entrada mostraré como utilizar Spring Boot y Redis con el objetivo de almacenar los objetos como JSON y no como la forma de serialización de Java por defecto que tiene RedisTemplate. Los test están con Testcontainers, Junit 5 y AssertJ. Lo primero es la clase que nos convoca, la configuración de RedisTemplate: @Configuration public class RedisConfig { @Autowired private ConfigurableApplicationContext context; @Bean @Primary public RedisTemplate redisTemplate(JedisConnectionFactory conn) { RedisTemplate template = new RedisTemplate<>(); template.setConnectionFactory(conn); template.setDefaultSerializer(new GenericJackson2JsonRedisSerializer()); template.setKeySerializer(new StringRedisSerializer()); template.setHashKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); return template; } @Bean public JedisConnectionFactory redisConnectionFactory(@Value("$...

Usando Redis en Pruebas [versión 2]

Previamente había comentado como utilizar Redis en pruebas mediante redis embebido, pero en esta ocasión utilizaremos Testcontainers , que como lo dicen en su página, podemos utilizar cualquier cosa que corra en docker en nuestros tests 😮. Comencemos Lo primero es incluir en nuestro pom la dependencia a testcontainers: <dependency> <groupId>org.testcontainers</groupId> <artifactId>testcontainers</artifactId> <version>1.11.2</version> </dependency> También incluimos otras librerías de test y el cliente redis: <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> <version>3.11.1</version> <scope>test</scope> </depende...

Servicios: Invertir las dependencias utilizando el sistema de módulos

Imagen
Hoy quiero mostrar un ejemplo del uso de servicios utilizando módulos. Esta característica está presente desde Java 9 y nos permite invertir la dirección de las dependencias dejando al sistema de módulos obtener las implementaciones que serán utilizadas y nuestro modulo consumidor solo tiene que interactuar con tipos abstractos. Creando Servicios Comenzamos con la siguiente figura: El Consumidor solo tiene conocimiento de la interface Servicio, la cual utiliza en tiempo de ejecución llamando al método identificar en cada una de las implementaciones que recibe, en este caso serán ServicioA y ServicioB. Lo entretenido del sistema de módulos es que nos entrega esta funcionalidad, podemos crear los módulos que provean los servicios, agregarlos al module path y serán provistos a la clase consumidora. La siguiente imagen muestra los módulos que usaremos:    Si es necesario agregar mas servicios generamos nuevos módulos que implementan la interface Servicio y los dejamos ...