Microservicios Con Spring-1
Microservicios Con Spring-1
con Spring
Junio 2019
Índice
2
01
Vista general y enlaces
http://spring.io
3
Arquitectura N-Capas con Orientación al Dominio
Seguridad
Capa de Servicios Distribuidos (Web-Services)
Capa de Aplicación
Cache
Capa de Infraestructuras de Persistencia de Datos
Repositorios (Implementación) Bases (Layer Supertyper)
Servicios de
Persistencia (ORMs, EF, Nhibernate) Modelo de Datos Agentes de Servicios
Aplicaciones
An Indra company 4
Enlaces
Microservicios Spring MVC
https://martinfowler.com/articles/microservices.html https://docs.spring.io/spring/docs/current/spring-framework-
https://microservices.io/ reference/web.html
Spring HATEOAS
Spring
https://docs.spring.io/spring-
https://spring.io/projects
hateoas/docs/0.25.1.RELEASE/reference/html
Ejemplos:
Spring Data https://github.com/spring-projects/spring-data-examples
https://docs.spring.io/spring-data/jpa/docs/2.1.5.RELEASE/reference/html/ https://github.com/spring-projects/spring-data-rest-webmvc
https://github.com/spring-projects/spring-hateoas-examples
https://github.com/spring-projects/spring-integration-samples
An Indra company 5
02
Spring con Spring Boot
http://spring.io
6
Spring
▪ Inicialmente era un ejemplo hecho para el libro “J2EE design and development” de Rod Johnson en 2003, que defendía alternativas a la
“visión oficial” de aplicación JavaEE basada en EJBs.
▪ Actualmente es un framework open source que facilita el desarrollo de aplicaciones java JEE & JSE (no está limitado a aplicaciones Web, ni
a Java, pueden ser .NET, Silverlight, Windows Phone, etc.)
▪ Provee de un contenedor encargado de manejar el ciclo de vida de los objetos (beans) para que los desarrolladores se enfoquen a la
lógica de negocio. Permite integración con diferentes frameworks.
▪ Surge como una alternativa a EJB’s
▪ Actualmente es un framework completo compuesto por múltiples módulos/proyectos que cubre todas las capas de la aplicación,
con decenas de desarrolladores y miles de descargas al día
▪ MVC.
▪ Negocio (donde empezó originalmente).
▪ Acceso a datos.
An Indra company 7
Características
▪ Ligero
▪ No se refiere a la cantidad de clases sino al mínimo impacto que se tiene al integrar Spring.
▪ No intrusivo
▪ Generalmente los objetos que se programan notienen dependencias de clases específicas de Spring
▪ Flexible
▪ Aunque Spring provee funcionalidad para manejar las diferentes capas de la aplicación (vista, lógica de negocio, acceso a datos) no es necesario usarlo para
todo. Brinda la posibilidad de utilizarlo en la capa o capas que queramos.
▪ Multiplataforma
▪ Escrito en Java, corre sobre JVM
An Indra company 8
Proyectos
Da soporte básico para inyección de Proporciona un enfoque coherente Toma una visión por defecto de la Protege tu aplicación con soporte de
dependencia, gestión de para el acceso a los datos: relacional, creación de la aplicación Spring y lo autenticación y autorización completo
transacciones, aplicaciones web, no relacional, map-reduce y más. pone en funcionamiento lo más rápido y extensible.
acceso a datos, mensajería y más. posible.
Spring Social Spring Cloud Data Flow Spring Cloud Spring for Android
Conecta fácilmente tus aplicaciones Un modelo operativo y de Proporciona un conjunto de Proporciona componentes clave de
con API de terceros como Facebook, programación nativo en la nube para herramientas para patrones comunes Spring para usar en el desarrollo de
Twitter, Linkedin y más. microservicios de datos componibles en sistemas distribuidos. Útil para aplicaciones de Android.
sobre una plataforma estructurada. construir e implementar
microservicios.
An Indra company 9
Módulos necesarios
An Indra company 10
Spring Boot
▪ Spring Boot es una herramienta que nace con la finalidad de simplificar aun más el desarrollo de aplicaciones basadas en el framework
Spring Core: que el desarrollador solo se centre en el desarrollo de la solución, olvidándose por completo de la compleja configuración que
actualmente tiene Spring Core para poder funcionar.
▪ Configuración: Spring Boot cuenta con un complejo módulo que autoconfigura todos los aspectos de nuestra aplicación para poder simplemente ejecutar
la aplicación, sin tener que definir absolutamente nada.
▪ Resolución de dependencias: Con Spring Boot solo hay que determinar que tipo de proyecto estaremos utilizando, y Spring Boot se encarga de resolver
todas las librerías/dependencias para que la aplicación funcione.
▪ Despliegue: Spring Boot se puede ejecutar como una aplicación Stand-alone, pero también es posible ejecutar aplicaciones web, ya que es posible
desplegar las aplicaciones mediante un servidor web integrado, como es el caso de Tomcat, Jetty o Undertow.
▪ Métricas: Por defecto, Spring Boot cuenta con servicios que permite consultar el estado de salud de la aplicación, permitiendo saber si la aplicación está
encendida o apagada, memoria utilizada y disponible, número y detalle de los Bean’s creado por la aplicación, controles para el prendido y apagado, etc.
▪ Extensible: Spring Boot permite la creación de complementos, los cuales ayudan a que la comunidad de Software Libre cree nuevos módulos que
faciliten aún más el desarrollo.
▪ Productividad: Herramientas de productividad para desarrolladores como LiveReload y Auto Restart, funcionan en nuestro IDE favorito: Spring Tool Suite,
IntelliJ IDEA y NetBeans.
An Indra company 11
Utilidades para empezar de cero. Entorno
Descargar Hibernate:
▪ http://hibernate.org/orm/downloads/
An Indra company 12
Utilidades para empezar de cero. Instalación
https://spring.io/tools
An Indra company 13
Utilidades para empezar de cero. Crear proyecto
Desde web:
▪ https://start.spring.io/
▪ Descomprimir en el workspace
▪ Import--Maven --Existing Maven Project
Desde Eclipse:
▪ New Project --Sprint Boot --Spring Started Project
Dependencias:
▪ Web.
▪ JPA.
▪ JDBC (o proyecto personalizado).
An Indra company 14
Utilidades para empezar de cero. Dependencias opcionales
An Indra company 15
Utilidades para empezar de cero. Application
@SpringBootApplication
public class DemoApplication implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
// Opcional: Procesar los args una vez arrancado SprintBoot
An Indra company 16
Utilidades para empezar de cero. Configuración
@Configuration: Indica que esta es una clase usada para configurar el contenedor Spring.
@ComponentScan: Escanea los paquetes de nuestro proyecto en busca de los componentes que hayamos creado. Son las clases que utilizan
las siguientes anotaciones: @Component, @Service, @Controller, @Repository.
@EnableAutoConfiguration: Habilita la configuración automática. Esta herramienta analiza el classpath y el archivo application.properties
para configurar nuestra aplicación en base a las librerías y valores de configuración encontrados. Por ejemplo: al encontrar el motor de bases
de datos H2, la aplicación se configura para utilizar este motor de datos. Al encontrar, Thymeleaf se crearan los beans necesarios para utilizar
este motor de plantillas para generar las vistas de nuestra aplicación web.
An Indra company 17
Utilidades para empezar de cero. Configuración
▪ Editar src/main/resources/application.properties:
# Oracle settings
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:xe
spring.datasource.username=hr
spring.datasource.password=hr
spring.datasource.driver-class=oracle.jdbc.driver.OracleDriver
# MySQL settings
spring.datasource.url=jdbc:mysql://localhost:3306/sakila spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
server.port=8080
An Indra company 18
Utilidades para empezar de cero. Oracle Driver con Maven
▪ http://www.oracle.com/technetwork/database/features/jdbc/index-091264.html
▪ Instalación de Maven:
▪ Descargar y descomprimir (https://maven.apache.org)
▪ Añadir al PATH: C:\Program Files\apache-maven\bin
▪ Comprobar en la consola de comandos: mvn -v
▪ En el fichero pom.xml:
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0</version>
</dependency>
An Indra company 19
Utilidades para empezar de cero. Proxy configuration: Maven
▪ Referenciarlo en Window → Preferences → Maven → User setting → User setting , browse…, seleccionar
fichero recién creado, aceptar, update setting, aplicar y cerrar.
An Indra company 20
Utilidades para empezar de cero. Instalación de MySQL
▪ Descargar e instalar:
▪ https://mariadb.org /download/
An Indra company 21
03
IoC con Spring Core
https://docs.spring.io/spring-
framework/docs/current/reference/html/
22
Inversión de Control
▪ Inversión de control (Inversion of Control en inglés, IoC) es un concepto junto a unas técnicas de programación:
▪ En las que el flujo de ejecución de un programa se invierte respecto a los métodos de programación tradicionales,
▪ En los que la interacción se expresa de forma imperativa haciendo llamadas a procedimientos (procedure calls) o funciones.
▪ Tradicionalmente el programador especifica la secuencia de decisiones y procedimientos que pueden darse durante el ciclo de vida de
un programa mediante llamadas a funciones.
▪ En su lugar, en la inversión de control se especifican respuestas deseadas a sucesos o solicitudes de datos concretas, dejando que algún
tipo de entidad o arquitectura externa lleve a cabo las acciones de control que se requieran en el orden necesario y para el conjunto de
sucesos que tengan que ocurrir.
An Indra company 23
Inyección de Dependencias
▪ Inyección de Dependencias (en inglés Dependency Injection, DI) es un patrón de arquitectura orientado a objetos, en el que se inyectan
objetos a una clase en lugar de ser la propia clase quien cree el objeto. Básicamente recomienda que las dependencias de una clase no
sean creadas desde el propio objeto, sino que sean configuradas desde fuera de la clase.
▪ La inyección de dependencias (DI) procede del patrón de diseño más general que es la Inversión de Control (IoC).
▪ Al aplicar este patrón se consigue que las clases sean independientes unas de otras e incrementa la reutilización y la extensibilidad de la
aplicación, además de facilitar las pruebas unitarias de las mismas.
▪ Desde el punto de vista de Java, un diseño basado en DI puede implementarse mediante el lenguaje estándar, dado que una clase puede
leer las dependencias de otra clase por medio del API Reflection de Java y crear una instancia de dicha clase inyectándole sus
dependencias.
An Indra company 24
Inyección
▪ El desacoplamiento es más eficaz, pues los objetos no deben de conocer donde están sus dependencias ni cuales son.
An Indra company 25
Introducción
▪ La inyección de dependencias será bien por constructor o bien por métodos setter.
▪ La configuración podrá realizarse bien por anotaciones Java o mediante un fichero XML (XMLBeanFactory).
An Indra company 26
Modulo de dependencias
An Indra company 27
Beans
▪ Los beans se corresponden a los objetos reales que conforman la aplicación y que requieren ser
inyectables: los objetos de la capa de servicio, los objetos de acceso a datos (DAO), los objetos de
presentación (como las instancias Action de Struts), los objetos de infraestructura (como Hibernate
SessionFactories, JMS Queues), etc.
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- services -->
<bean id="petStore" class="com.samples.PetStoreServiceImpl">
<property name="accountDao" ref="accountDao"/>
<property name="itemDao" ref="itemDao"/>
<!-- additional collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions for services go here -->
</beans>
An Indra company 28
Bean factory
▪ Cualquier Bean Factory permite la configuración y la unión de objetos mediante la inyección de dependencia.
▪ Este Bean Factory también permite una gestión del ciclo de vida de los beans instanciados en él.
▪ Todos los contenedores Spring (Bean Factory) implementan el interface BeanFactory y algunos sub-interfaces para ampliar funcionalidades
<<Interface>> <<Interface>>
ResourceLoader BeanFactory
<<Interface>>
ApplicationContext
An Indra company 29
Application Context
▪ Spring también soporta algo más avanzado, una “fábrica de beans” llamada contexto de aplicación.
▪ Application Context es una especificación de Bean Factory que implementa la interface ApplicationContext.
<<Interface>> <<Interface>>
ResourceLoader BeanFactory
<<Interface>>
ApplicationContext
An Indra company 30
Uso de la inyección de dependencias
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("META-
INF/applicationContext.xml");
BeanFactory factory = context;
Client client = (Client )factory.getBean("ID_Cliente");
client.go();
}
▪ Muestra:
▪ Este es un servicio…
31
Anotaciones IoC
Autodescubrimiento
@Scope
@Component
@Repository
@Service
@Controller
Personalización
@Configuration
@Bean
Inyección
@Autowire (@Inject)
@Qualifier (@Named)
@Value
@PropertySource
@Required
@Resource
Otras
@PostConstruct
@PreDestroy
32
Estereotipos
▪ Spring define un conjunto de anotaciones core que categorizan cada uno de los componentes asociándoles una
responsabilidad concreta.
▪ @Component: Es el estereotipo general y permite anotar un bean para que Spring lo considere uno de sus objetos.
▪ @Repository: Es el estereotipo que se encarga de dar de alta un bean para que implemente el patrón repositorio que es el
encargado de almacenar datos en una base de datos o repositorio de información que se necesite. Al marcar el bean con
esta anotación Spring aporta servicios transversales como conversión de tipos de excepciones.
▪ @Service: Este estereotipo se encarga de gestionar las operaciones de negocio más importantes a nivel de la aplicación y
aglutina llamadas a varios repositorios de forma simultánea. Su tarea fundamental es la de agregador.
▪ @Controller: El último de los estereotipos que es el que realiza las tareas de controlador y gestión de la comunicación entre
el usuario y el aplicativo. Para ello, se apoya habitualmente en algún motor de plantillas o librería de etiquetas que facilitan la
creación de páginas.
▪ @RestController: Es una especialización de controller que contiene las anotaciones @Controller y @ResponseBody (escribe
directamente en el cuerpo de la respuesta en lugar de la vista).
An Indra company 33
Alcance
▪ Un aspecto importante del ciclo de vida de los Beans es si el contenedor creara una única instancia o tantas
como ámbitos sean necesarios.
▪ prototype: No reutiliza instancias, genera siempre una nueva.
▪ instancia. @Scope("prototype")
▪ singleton: (Predeterminado) Instancia única para todo el contenedor Spring IoC. @Scope("singleton") @Singleton
request: Instancia única para el ciclo de vida de una sola solicitud HTTP. Cada solicitud HTTP tiene su propia
instancia única.
An Indra company 34
Inyección
@Autowire
▪ En propiedades (setter):
@Autowire
▪ En constructores
▪ Por defecto la inyección es obligatoria. Se puede marcar como opcional en cuyo caso, si no encuentra el Bean, inyectará un null.
@Autowire(required=false) private MyBeans myBeans;
▪ Se puede completar @Autowire con la anotación @Lazy para inyectar un proxy de resolución lenta.
An Indra company 35
Acceso a ficheros de propiedades
▪ Acceso directo:
@Value("${spring.datasource.username}") private String name;
An Indra company 36
Ciclo de Vida
▪ Con la inyección el proceso de creación y destrucción de las instancias de los beans es administrado por el contenedor.
▪ Para poder intervenir en el ciclo para controlar la creación y destrucción de las instancias se puede:
▪ Implementar las interfaces InitializingBean y DisposableBean de devoluciones de llamada.
▪ Sobrescribir los métodos init() y destroy().
▪ Anotar los métodos con @PostConstruct y @PreDestroy.
An Indra company 37
Configuración por código
▪ Hay que crear una (o varias) clase anotada con @Configuration que contendrá un método por cada clase/interfaz
(sin estereotipo) que se quiera tratar como un Bean inyectable.
▪ El método irá anotado con @Bean . Se debería llamar como la clase, en notación CamelCase, y devolver del tipo
de la clase la instancia ya creada. Adicionalmente se puede anotar con @Scope y con @Qualifier.
▪ public class MyBean { … }
@Configuration
▪ public class MyConfig {
@Bean
@Scope("prototype")
▪ public MyBean myBean() { … ]
An Indra company 38
Doble herencia
An Indra company 39
Cliente
@Service("ID_Cliente")
public class Client {
private final Service service;
@Autowired
public void setService(Service service){
this.service = service;
}
▪ Cuando trabaje con anotaciones estándar, hay que tener en cuenta que algunas características importantes no están disponibles.
@Autowired @Inject
@Scope("singleton") @Singleton
@Value -
@Required -
@Lazy -
An Indra company 41
04
Acceso a datos con Spring
Data
42
Spring Data
▪ Spring Framework ya proporcionaba soporte para JDBC, Hibernate, JPA o JDO, simplificando la implementación de la capa de acceso a
datos, unificando la configuración y creando una jerarquía de excepciones común para todas ellas.
▪ Spring Data es un proyecto (subproyectos) de SpringSource cuyo propósito es unificar y facilitar el acceso a distintos tipos de tecnologías
de persistencia, tanto a bases de datos relacionales como a las del tipo NoSQL.
▪ Spring Data viene a cubrir el soporte necesario para distintas tecnologías de bases de datos NoSQL integrándolas con las tecnologías
de acceso a datos tradicionales, simplificando el trabajo a la hora de crear las implementaciones concretas.
▪ Con cada tipo de tecnología de persistencia, los DAOs (Data Access Objects) ofrecen las funcionalidades típicas de CRUD para objetos
de dominio propios, métodos de búsqueda, ordenación y paginación. Spring Data proporciona interfaces genéricas para estos
aspectos (CrudRepository, PagingAndSortingRepository) e implementaciones específicas para cada tipo de tecnología depersistencia.
An Indra company 43
Modelos: Entidades
▪ Para cada propiedad que queramos persistir debe haber un método get/set asociado.
An Indra company 44
Anotaciones JPA
Anotación Descripción
▪ Se aplica a la clase.
@Entity
▪ Indica que esta clase Java es una entidad a persistir.
▪ Se aplica a la clase e indica el nombre de la tabla de la base de datos donde se persistirá la clase.
@Table(name="Tabla")
▪ Es opcional si el nombre de la clase coincide con el de la tabla.
@Id ▪ Se aplica a una propiedad Java e indica que este atributo es la clave primaria.
▪ Se aplica a una propiedad Java e indica el nombre de la columna de la base de datos en la que se persistirá la propiedad.
@Column(name="Id")
▪ Es opcional si el nombre de la propiedad Java coincide con el de la columna de la base de datos.
▪ name: su nombre.
▪ length: su longitud.
▪ precision: número total de dígitos.
▪ scale: número de digitos decimales.
@Column(…)
▪ unique: restriccion valor único.
▪ nullable: restriccion valor obligatorio.
▪ insertable: es insertable.
▪ updatable: es modificable.
@Transient ▪ Se aplica a una propiedad Java e indica que este atributo no es persistente
An Indra company 45
Asociaciones
▪ @OneToOne(cascade=CascadeType.ALL):
▪ @PrimaryKeyJoinColumn:
▪ Indicamos que la relación entre las dos tablas se realiza mediante la clave primaria.
An Indra company 46
Asociaciones
▪ Uno a Muchos:
▪ En Uno:
▪ Dispone de una propiedad de tipo colección que contiene las referencias de las entidades muchos:
▪ List: Ordenada conrepetidos.
▪ Set: Desordenada sinrepetidos.
▪ @OneToMany(mappedBy="propEnMuchos",cascade= CascadeType.ALL)
▪ mappedBy: contendrá el nombre de la propiedad en la entidad Muchos con la referencia a la entidad Uno.
▪ @IndexColumn ( name="idx")
▪ Opcional. Nombre de la columna que la tabla Muchos para el orden dentro de la Lista.
▪ En Muchos:
▪ Dispone de una propiedad con la referencia de la entidad Uno.
▪ @ManyToOne
▪ Esta anotación indica la relación de Muchos a Uno.
▪ @JoinColumn ( name="idFK")
▪ Indicaremos el nombre de la columna que en la tabla muchos contiene la clave ajena a la tabla Uno.
An Indra company 47
Asociaciones
▪ @ManyToMany(cascade=CascadeType.ALL):
▪ @ManyToMany(mappedBy="propEnOtroMuchos"):
▪ mappedBy: Propiedad con la colección en la otra entidad para preservar la sincronicidad entre ambos lados.
An Indra company 48
Cascada
▪ El atributo cascade se utiliza en los mapeos de las asociaciones para indicar cuando se debe propagar la acción en una instancia hacia la
instancias relacionadas mediante la asociación.
▪ DETACH (Separar)
▪ MERGE (Modificar)
▪ PERSIST (Crear)
▪ REFRESH (Releer)
▪ REMOVE (Borrar)
▪ NONE
An Indra company 49
Mapeo de Herencia
An Indra company 50
Repositorio
▪ Un repositorio es una clase que actúa de mediador entre el dominio de la aplicación y los datos que le dan persistencia.
▪ El interfaz expuesto por el repositorio no cambia aunque cambie la implementación de la fuente de datos subyacente (diferentes esquemas
de almacenamiento).
▪ Se crea un repositorio por cada entidad de dominio que ofrece los métodos CRUD (Create-Read-Update-Delete ), de búsqueda, ordenación y
paginación.
An Indra company 51
Repositorio
▪ Con el soporte de Spring Data, la tarea repetitiva de crear las implementaciones concretas de DAO para las entidades se simplifica
porque solo vamos se necesita un interfaz que extiende uno de los siguientes interfaces:
▪ CrudRepository<T,ID>
▪ count(), delete(T entity), deleteAll(), deleteAll(Iterable<? extends T> entities), deleteById(ID id), existsById(ID id), findAll(), findAllById(Iterable<ID> ids),
findById(ID id), save(S entity), saveAll(Iterable<S> entities)
▪ PagingAndSortingRepository<T,ID>
▪ JpaRepository<T,ID>
▪ @Autowired
An Indra company 52
Repositorio
▪ El interfaz puede ser ampliado con nuevos métodos que serán implementados por Spring:
▪ Derivando la consulta del nombre del método directamente.
▪ La implementación se realizará mediante la decodificación del nombre del método. Dispone de una sintaxis especifica para crear dichos
nombres:
▪ List<Profesor> findByNombreStartingWiths(String nombre);
An Indra company 53
Repositorio
▪ Parámetros:
▪ Un parámetro por cada operador que requiera valor, y debe ser del tipo apropiado.
▪ Parámetros opcionales:
▪ Pageable, Sort
An Indra company 54
Repositorio
An Indra company 55
Repositorio
An Indra company 56
Repositorio
An Indra company 57
Repositorio
▪ Count, delete:
▪ Long
▪ CompletableFuture<Entidad>
▪ ListenableFuture<Entidad>
58
Repositorio
@Modifying
@Query("delete from Professor p where p.age > 67")
List<Professor> deleteRetired();
59
DTO
▪ Un objeto de transferencia de datos (DTO) es un objeto que define cómo se enviarán los datos a través de la red.
▪ Su finalidad es:
▪ Desacoplar del nivel de servicio de la capa de base de datos.
▪ Eliminar el formato de grafos de objetos que contienen objetos anidados, para que sean más conveniente para los clientes.
60
Lombok
▪ https://projectlombok.org/
▪ En las clases Java hay mucho código que se repite una y otra vez: constructores, equals, getters y setters. Métodos que quedan definidos
una vez que dicha clase ha concretado sus propiedades, y que salvo ajustes menores, serán siempre sota, caballo y rey.
▪ Project Lombok es una biblioteca de Java que se conecta automáticamente al editor y crea herramientas que automatizan la escritura de
Java.
▪ Mediante simples anotaciones ya nunca más vuelves a escribir otro método get o equals.
@Data @AllArgsConstructor @NoArgsConstructor public class MyDTO {
▪ La anotación @Value (no confundir con la de Spring) crea la versión de solo lectura.
61
MapStruct
▪ http://mapstruct.org
▪ Las aplicaciones a menudo contienen modelos de objetos similares pero diferentes, donde los
datos en dos modelos pueden ser similares pero la estructura y las responsabilidades de los
modelos son diferentes. El mapeo de objetos facilita la conversión de un modelo a otro,
permitiendo que los modelos separados permanezcan segregados.
})
PersistenceMongoFindInventoryIDTO toPersistenceMongoFindInventoryIDTO(InventoryGetServiceIDTO
idto);
62
Proyecciones
▪ Los métodos de consulta de Spring Data generalmente devuelven una o varias instancias de la raíz agregada administrada por el
repositorio. Sin embargo, a veces puede ser conveniente crear proyecciones basadas en ciertos atributos de esos tipos. Spring Data
permite modelar tipos de retorno dedicados, para recuperar de forma más selectiva vistas parciales de los agregados administrados.
▪ La forma más sencilla de limitar el resultado de las consultas solo a los atributos deseados es declarar una interfaz o DTO que exponga los
métodos de acceso para las propiedades a leer, que deben coincidir exactamente con las propiedades de la entidad:
public interface NamesOnly {
String getNombre();
String getApellidos();
}
▪ El motor de ejecución de consultas crea instancias de proxy de esa interfaz en tiempo de ejecución para cada elemento devuelto y
reenvía las llamadas a los métodos expuestos al objeto de destino.
public interface ProfesorRepository extends JpaRepository<Profesor, Long> {
List<NamesOnly> findByNombreStartingWith(Stringnombre);
}
63
Proyecciones
▪ Se puede implementar una lógica personalizada mas compleja en un bean de Spring y luego invocarla desde la expresión SpEL:
@Component class MyBean{
String getFullName(Person person) { … }
}
interface NamesOnly { @Value("#{@myBean.getFullName(target)}") String getFullName();
…
}
▪ Las proyecciones dinámicas permiten utilizar genéricos en la definición del repositorio para resolver el tipo de devuelto en el momento
de la invocación:
public interface ProfesorRepository extends JpaRepository<Profesor, Long> {
<T> List<T> findByNombreStartingWith(String prefijo, Class<T> type);
}
dao.findByNombreStartingWith("J", ProfesorShortDTO.class)
65
Serialización Jackson
▪ Jackson es una librería de utilidad de Java que nos simplifica el trabajo de serializar (convertir un objeto Java en una cadena de texto con su
representación JSON), y des-serializar (convertir una cadena de texto con una representación de JSON de un objeto en un objeto real de
Java) objetos JSON.
▪ Jackson es bastante “inteligente” y sin decirle nada es capaz de serializar y des serializar bastante bien los objetos. Para ello usa
básicamente la reflexión de manera que si en el objeto JSON tenemos un atributo “name”, para la serialización buscará un método
“getName()” y para la des-serialización buscará un método “setName(String s)”.
ObjectMapper objectMapper = new ObjectMapper();
66
Serialización Jackson
▪ }
An Indra company 67
Serialización Jackson
▪ @JsonInclude: se usa para incluir propiedades con valores vacíos, nulos, o predeterminados.
▪ @JsonInclude(Include.NON_NULL) public class Item {
▪ @JsonAutoDetect: se usa para anular la semántica predeterminada de qué propiedades son visibles y
cuáles no.
▪ @JsonAutoDetect(fieldVisibility = Visibility.ANY) public class Item {
An Indra company 68
Serialización Jackson
▪ @JsonView: permite indicar la Vista en la que se incluirá la propiedad para la serialización / deserialización.
public class Views {
.writeValueAsString(item);
An Indra company 69
Serialización Jackson
▪ @JsonFilter: indica el filtro que se utilizará durante la serialización (es obligatorio suministrarlo).
@JsonFilter("ItemFilter") public class Item {
An Indra company 70
Serialización Jackson
▪ @JsonIdentityInfo: indica la identidad del objeto para evitar problemas de recursión infinita.
▪ @JsonIdentityInfo(
▪ generator = ObjectIdGenerators.PropertyGenerator.class,
▪ property = "id")
An Indra company 71
Serialización XML (JAXB)
▪ JAXB (Java XML API Binding) proporciona a una manera rápida, conveniente de crear enlaces bidireccionales entre los documentos XML y
los objetos Java. Dado un esquema que especifica la estructura de los datos XML, el compilador JAXB genera un conjunto de clases de Java
que contienen todo el código para analizar los documentos XML basados en el esquema. Una aplicación que utilice las clases generadas
puede construir un árbol de objetos Java que representa un documento XML, manipular el contenido del árbol, y regenerar los documentos
del árbol, todo ello en XML sin requerir que el desarrollador escriba código de análisis y de proceso complejo.
▪ Es personalizable.
▪ Es extensible.
72
Anotaciones principales (JAXB)
▪ Para indicar a los formateadores JAXB como transformar un objeto Java a XML y viceversa se puede anotar (javax.xml.bind.annotation) la
clases JavaBean para que JAXP infiera el esquema de unión.
▪ @XmlType(propOrder = { "field2", "field1",.. }): Permite definir en que orden se van escribir los elementos dentro del XML.
73
Validaciones
▪ Desde la versión 3, Spring ha simplificado y potenciado en gran medida la validación de datos, gracias a la adopción de la especificación
JSR 303. Este API permite validar los datos de manera declarativa, con el uso de anotaciones. Esto nos facilita la validación de los datos
enviados antes de llegar al controlador REST.
74
Validaciones
• @NotBlank: Comprueba que la secuencia de caracteres anotados no sea nula y que la longitud recortada sea
mayor que 0. La diferencia con @NotEmptyes que esta restricción solo se puede aplicar en secuencias de
caracteres y que los espacios en blanco finales se ignoran.
@Negative: Comprueba si el elemento es estrictamente negativo. Los valores cero se consideran inválidos.
@Positive: Comprueba si el elemento es estrictamente positivo. Los valores cero se consideran inválidos.
@DecimalMin(value=, inclusive=): Comprueba si el valor anotado es mayor que el mínimo especificado, cuando
inclusive= falso. De lo contrario, si el valor es mayor o igual al mínimo especificado.
An Indra company 76
Validaciones
@Email: Comprueba si la secuencia de caracteres especificada es una dirección de correo electrónico válida.
@Pattern(regex=, flags=): Comprueba si la cadena anotada coincide con la expresión regular regex, considerando
la bandera dada.
@Size(min=, max=): Comprueba si el tamaño del elemento anotado está entre min y max (inclusive).
An Indra company 77
Transacciones
▪ Por defecto, los métodos CRUD en las instancias del repositorio son transaccionales. Para las operaciones de lectura, el indicador readOnly
de configuración de transacción se establece en true para optimizar el proceso. Todos los demás se configuran con un plano
@Transactional para que se aplique la configuración de transacción predeterminada.
▪ Cuando se van a realizar varias llamadas al repositorio o a varios repositorios se puede anotar con @Transactional el método para
que todas las operaciones se encuentren dentro de la misma transacción.
▪ @Transactional
78
Servicio
▪ Los servicios representan operaciones, acciones o actividades que no pertenecen conceptualmente a ningún objeto de
dominio concreto. Los servicios no tienen ni estado propio ni un significado más allá que la acción que los definen. Se anotan
con @Service.
▪ Application services
Son responsables del flujo principal de la aplicación, es decir, son los casos de uso de nuestra aplicación. Son la parte visible al
exterior del dominio de nuestro sistema, por lo que son el punto de entrada-salida para interactuar con la funcionalidad interna
del dominio. Su función es coordinar entidades, value objects, domain services e infrastructure services para llevar a cabo una
acción.
▪ Infrastructure services
Declaran comportamiento que no pertenece realmente al dominio de la aplicación pero que debemos ser capaces de realizar
como parte de este.
79
¡Gracias!