Java


Test Pyramid
Introducción En esta publicación veremos cómo utilizar MockMvc para probar endpoints creados con Spring. Este es el primer post de una serie dónde analizaremos las principales ventajas de utilizar Spring MVC test framework para probar clases de tipo Controller respecto a otras soluciones y cuáles son las distintas formas de configurar los tests. El código fuente completo del artículo puede encontrarse en GitHub. El proyecto contiene un controller MVC estándar que reenvía las llamadas a un recurso estático y dos controladores REST que devuelven una lista de lenguajes y otra de cafés. MockMvc y la pirámide de los tests En […]

MockMvc – Introducción a Spring MVC testing framework: Probando endpoints


Introducción Esta es la segunda publicación en la seria acerca de Spring Bean Scopes. En el tutorial anterior vimos que cuando se inyectaban Beans de ámbito Prototype dentro de un Singleton  aparecían algunas trabas. El principal problema es que las dependencias Autowired se inyectan en el Singleton cuando este se instancia (evento que ocurre una sola vez) por lo que aunque el Bean inyectado se haya declarado como Prototype, en realidad se comportará como un Singleton. El siguiente código resalta este comportamiento: [crayon-5bf35899591a7613678149/] En el ejemplo anterior, a pesar de que el objeto devuelto por el método getAutowiredSample se ha declarado como un […]

Spring Bean Scopes: Singleton con Prototypes


Java 10
Introducción Como probablemente ya sabrás, Java 10 se liberó el pasado 20 de marzo siguiendo el nuevo programa para liberar versiones cada 6 meses. Esta versión viene tras el lanzamiento de Java 9 el pasado septiembre de 2017 y deja esta última version obsoleta. Java 11 se liberará como una versión de soporte prolongado (LTS) y tendrá un periodo de vida mucho más amplio, pero hasta entonces, veamos cuáles son algunas de las nueva funcionalidades en Java 10. Versionado de lanzamientos basado en tiempo Java 10 introduce el nuevo versionado basado en tiempo (JEP 322) que es una reestructuración de JEP 223 liberado en Java […]

Java 10: Probando las nuevas funcionalidades



Java 8 Streams
Introducción En esta publicación veremos como emplear los streams introducidos en Java 8 para obtener un Map a partir de un List. Los mapas son estructuras de datos compuestas por una colección de elementos clave-valor de forma que una clave sólo puede existir de forma única dentro de la colección. Esto nos permite realizar búsquedas de elementos de forma muy rápida a partir de su clave sin necesidad de recorrer la colección completa. Es muy común que al enfrentarnos con algún problema partamos de una lista de elementos y queramos obtener un mapa de forma que podamos optimizar el algoritmo […]

Java 8 Streams: Convertir List en Map


Spring-Data + MongoDB
Introducción Spring Data facilita mucho el proceso de trabajo con entidades de datos y ofrece una implementación específica para MongoDB. Se pueden definir consultas simplemente creando interfaces con métodos que siguen una convención de nombres o anotándolos con @Query y Spring automágicamente generará una implementación por nosotros. En la mayoría de ocasiones esto nos bastará para operaciones CRUD o de consultas sencillas y no será necesario definir métodos adicionales. Esto nos permitirá finalizar el desarrollo de la aplicación o de la funcionalidad de acceso a datos de forma muy rápida sin tener que escribir código repetitivo. Sin embargo, en muchas ocasiones […]

Spring Data MongoDB: Implementación de un repositorio a medida


Introducción Tras la ejecución de alguna herramienta de análisis estático de código o analizando el código desde algún IDE, es posible muy probable haberse topado con un mensaje en relación a los campos @Autowired: Field injection is not recommended Esta publicación muestra los distintos tipos de inyección disponibles en Spring y cuáles son los patrones de uso recomendados para cada uno de ellos. Tipos de Inyección A pesar de que la documentación actual de  Spring Framework (5.0.3) únicamente define dos tipos de inyección, en realidad hay tres: Inyección de dependencias basada en el constructor (Constructor-based) Inyección de dependencias basada en […]

Inyección de campos desaconsejada “Field injection is not recommended” – ...



Introducción En este tutorial se muestran los distintos ámbitos (Scopes) para un Bean que podemos encontrar en Spring Framework. Es prioritario entender que la definición de un Bean no es más que una receta para crear instancias de una clase de acuerdo con dicha definición. Partiendo de esta base, se puede asumir que la misma receta para crear instancias de una clase se puede emplear en múltiples ocasiones o varias veces durante el ciclo de vida de una aplicación. Una de las características que permite Spring configurar en la definición de los Beans es el Scope o ámbito de los […]

Spring Bean Scopes: Guía para comprender los distintos scopes (ámbitos) ...


Spring boot as a Linux service
Introducción En este post mostraremos como configurar una aplicación Spring Boot para que se ejecute como un servicio en Linux. En primer lugar se muestran las instrucciones para configurar el servicio con scripts compatibles con sistemas de inicio tipo System V, en segundo se muestra como configurar el servicio en sistemas más nuevos que emplean systemd. Jar ejecutable Una de las ventajas de Spring Boot es que nos permite crear Jar ejecutables de forma autónoma, esto nos permite tratar directamente la aplicación empaquetada en un Jar como un ejecutable que a su vez dispone de parámetros como “start”, “stop”, “restart”, […]

Spring-boot como un servicio en Linux


Introducción En este post mostraré cómo asignar un valor de una secuencia incrementada de forma automática a un campo empleando una colección de mongo. Para ello emplearemos la misma técnica que se muestra en el tutorial de mongodb.com pero con métodos puramente Java. Es importante reseñar que este valor no debería de emplearse como identificador único del documento, Mongo ya dispone de mejores métodos para asignar identificadores a documentos, y por lo general sería una mala práctica. Por otro lado, en sistemas distribuidos o en bases de datos con una enorme cantidad de documentos, tampoco debería de emplearse esta metodología. […]

Spring-data + Mongo: Secuencia autoincremental en MongoDB mediante un servicio ...



build.gradle script 2
Introducción En este post mostraré cómo servir una aplicación Frontend creada con Angular (>2) empleando como Backend y servidor de páginas estático una aplicación Java desarrollada con Spring Boot  utilizando Gradle como herramienta para la construcción y desplegado automatizado. Requisitos La pila de tecnologías necesarias para poder completar este tutorial son: Node.js Angular CLI Gradle El principal objetivo es conseguir un npm install + build que integre y despliegue los ficheros de distribución en el directorio de recursos estáticos de Spring al mismo tiempo que se hace la construcción y despliegue de la aplicación Java. Del mismo modo que se ha […]

Integrando Angular y Spring Boot mediante Gradle


Spring + EclipseLink JPA
Spring Data JPA Spring emplea Hibernate como proveedor de JPA por defecto. Aunque Hibernate es una buena elección, algunos preferimos emplear EclipseLink ya que en un principio se suponía que era la implementación de referencia para el JSR de Persistencia en Java. En este tutorial mostraremos como configurar una aplicación Spring Boot para que use EclipseLink como capa de persistencia JPA para una base de datos PostgreSQL, aunque se podría emplear cualquier otro tipo de base de datos. Arreglando dependencias Para poder emplear EclipseLink, tenemos que quitar el EntityManager de Hibernate del classpath para evitarnos problemas. Para ello simplemente tenemos que añadir una exclusión […]

Spring Data JPA + EclipseLink: Configurando Spring-Boot para usar EclipseLink ...


¿Una herramienta más para sincronizar correo IMAP? Hace un par de años, cuando liberamos por primera vez mnIMAPSync, ya había varias herramientas disponibles  para sincronizar el correo electrónico. El problema con la mayoría de ellas es que cuando se hacen copias de seguridad o migraciones incrementales del correo, algunos mensajes, en general aquellos que no está conforme a las especificaciones del RFC, se duplican en el servidor donde hacemos la copia. Esto se debe principalmente a headers incorrectos o a que el mensaje carece de message-id. Al no disponer de ninguna herramienta, tuvimos que programar una que hiciese correctamente el trabajo. La […]

Migración de correo electrónico mediante mnIMAPSync