Desarrollo Con Spring 5
Desarrollo Con Spring 5
Temario
Objetivos:
• Spring Core y AOP • Conocer y aplicar de manera práctica el framework JUnit, SpringTest
• Spring boot y RestAssured para probar las APIs REST de nuestro backend.
• Spring integration
• Spring social
Spring Core
y AOP
Spring
• Inicialmente las aplicaciones web de
Java se desarrollaban utilizando
Servlets, aunque este modelo
rápidamente cayó en desuso,
debido a que era difícil de mantener
y no se reutilizan componentes
entre otras limitaciones.
• La arquitectura de Spring
es modular, de tal forma
que es posible decidir que
componentes de Spring
queremos utilizar.
• La arquitectura modular
de Spring utiliza OSGi.
www.springsource.org/sts
Permite:
El core container es el responsable de parsear los archivos de configuración o anotaciones para crear
los beans:
Spring
Beans
Bean 1
Configuración XML
Bean 2
BeanFactory
@nnotations
Bean …n
Bean factories: ciclo de vida
• Para habilitar este mecanismo, podemos hacerlo a través de una clase de configuración
Java:
@Configuration
@ComponentScan(basePackages = {
"com.pruebas.service",
"com.pruebas.repositorio" })
@ComponentScan(basePackageClasses = AppConfig.class)
public class ApplicationContextConfiguration { … }
Spring contiene varias implementaciones de este interface, cada una de ellas proporciona
las mismas características, pero se diferencian en el modo de cargar la configuración.
Implementación Tipo
ClassPathXmlApplicationContext Classpath(XML)
FileSystemXmlApplicationContext File System(XML)
AnnotationConfigApplicationContext Classpath (Java)
XmlWebApplicationContext Web Application Root(XML)
AnnotationConfigWebApplicationContext Web Application Classpath
Inyección de dependencia: configuración
Para acceder al bean inicializado con los valores anteriores usaremos este codigo:
• Continuando con la clase anterior, el contenedor de Spring intenta resolver el tipo de cada
argumento para inyectarlo adecuadamente, es decir, el siguiente ejemplo funcionaría
correctamente:
• Observa como hemos intercambiado la posición de los argumentos del ejemplo anterior, en
este caso el contenedor de Spring resuelve el orden correcto, atendiendo a los tipos de
cada argumento.
Tipos de inyección: por constructor
forma de resolver?: }
• La forma correcta es
identificando las propiedades <bean id="ejemploCons"class="com.pruebas.UsandoConstructores">
con el atributo «type»: <constructor-arg type="java.lang.String"value="Mas vale pajaro en mano…"/>
<constructor-arg ref="pedido"/>
<constructor-arg type="java.lang.Double"value="35"/>
</bean>
Tipos de inyección: por constructor
<bean id="coleccion"
class=“com.pruebas.InyectarCollection">
<property name="ciudades">
<!--list>
• Al crear una declaración de un bean podemos utilizar varios alias, separados por comas para
la misma clase, usando el atributo «name», en lugar de «id»:
<!--Hacemos uso de los alias -->
<bean name="coleccion, cols" class=“com.pruebas.InyectarCollection">
<property name="ciudades">
<!--list>…
class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list><value>com.pruebas.recursos.mensajes</value></list>
</property>
</bean>
Internacionalizacion con Spring
Implementación Descripción
Uses the ResourceBundle facility available on the JVM. It can
ResourceBundleMessageSource
only load resources from the classpath.
Works in a similar way as the ResourceBundleMessageSource
but adds reloading and caching capabilities. It allows for the
ReloadableResourceBundleMessageSource resources to be anywhere on the file system it uses the resource
loading mechanism in Spring.
Internacionalizacion con Spring
• La internacionalización está basada en archivos de tipo properties, que incluyen las claves
de las etiquetas i18n de la capa de presentación. Podemos configurarla haciendo uso de
las anotaciones.
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = { "com.pruebas.web" })
public class PruebasWebConfiguration extends WebMvcConfigurerAdapter {
@Bean
public MessageSource messageSource()
{ ReloadableResourceBundleMessageSource messageSource;
messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:/traducciones");
messageSource.setUseCodeAsDefaultMessage(true);
return messageSource;
}
}
Internacionalizacion con Spring: LocaleResolver
• Para que este mecanismo de i18n, realice su trabajo es necesario configurar el interface
LocaleResolver, el cual dispone de varias implementaciones que se ajustan a las
necesidades de diferentes tipos de aplicación.
Implementación Descripción
Always resolves to a fixed locale. All the users of our website use the same locale, so
FixedLocaleResolver
changing the locale isn’t supported.
Resolves (and stores) the locale in the user’s HttpSession. The attribute used to store the
locale can be configured, as well as the default locale to use if no locale is present. The
SessionLocaleResolver
drawback to this is that the locale isn’t stored between visits, so it must be set at least
once on the user’s session.
Uses the http accept header to resolve the locale to use. In general, this is the locale of
AcceptHeaderLocaleResolver the operating system of the user, so changing the locale isn’t supported. It is also the
default LocalResolver used by the DispatcherServlet.
Uses a cookie to store the user’s locale. The advantage of this resolver is
CookieLocaleResolver that the locale is kept on the client’s machine, so it will be available on
subsequent visits to the website
AOP con Spring
Comprobamos
que no hay errores
Iniciamos un al procesar el Detenemos el
servicio método - around servicio
• Para trabajar con AOP en Spring es necesario, añadir el soporte para AOP en el archivo
de configuración, en primer lugar comprobaremos los esquemas:
aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
<aop:aspectj-autoproxy/>
• Spring incluye un potente conjunto de anotaciones para trabajar con AOP aunque no usan
las características avanzadas de AspectJ, las anotaciones son:
Anotación Descripción
@Aspect Declares a class to be an aspect.
@After Declares a method to be called after a pointcut completes.
@AfterReturning Declares a method to be called after a pointcut returns successfully
@AfterThrowing Declares a method to be called after a pointcut throws an exception.
@Around Declares a method that will wrap the pointcut.
@Before Declares a method to be called before proceeding to the pointcut.
Declares that matching types should be given new parents—that is, it introduces new
@DeclareParents
functionality into matching types
@Pointcut Declares an empty method as a pointcut placeholder method.
import org.aspectj.lang.annotation.Aspect;
@Aspect
public class SATSupport { //
@Pointcut("execution(* incidencia(..))") // Este pointcut define la
coincidencia con los
public void incidencia() { //metodos llamados incidencia*
}
}
AOP con Spring: expresiones
@Aspect
public class SATSupport { // Declarada con @Aspect
@Pointcut("execution(* incidencia(..))")
public void incidencia() {
@Before("incidencia()")
public void setupLog() {
System.out.println(“Metodo incidencia ha sido invocado");
}
}
• Las expresiones pointcut nos permiten definir máscaras que serán usadas para interceptar
aquellos métodos que coincidan con la expresión. La forma general de una expresión
pointcut es ésta:
Expresión Descripción
execution(public * *(..)) Coincide con cualquier método public
Expresión Descripción
args(*, String) Cualquier método con un argumento de cualquier tipo y otro de tipo String
AOP con Spring: forma declarativa
• Desde las primeras versiones de Spring y como forma más clásica, es posible aplicar AOP
de forma declarativa vía XML:
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
• @Controller
• @RequestMapping
@Controller
public class AsistenteController
{
@RequestMapping("/asistente")
public ModelAndView control() {
ModelAndView mav = new ModelAndView();
mav.setViewName("ejemplo");
mav.addObject("message", "Ejemplo de controlador");
return mav;
}
}
• Además existen otras anotaciones como @RequestParam, @ModelAttribute que son útiles
tanto para Servlets MVC o Portlets.
Spring MVC: configuracion controladores
• Para conseguir que Spring realice una auto detección de las anotaciones en los
controladores, debemos indicarlo en el archivo de configuración:
<context:component-scan base-package="org.pruebas.ejemplos.controladores"/>
</beans>
Front controller: DispatcherServlet
Por sufijo: http://dominio/index.htm
Por prefijo: http://dominio/spring/index.htm
DispatcherServlet
1
Petición
2
/WEB-INF/web.xml Modelo
Máscara: *.htm
3
/WEB-INF/xxx-servlet.xml
CTRL
¿A dónde se dirige la peticion?: index 4
ViewResolver prefix: /WEB-INF/jsp/ MVC
ViewResolver suffix: .jsp
Spring MVC: controladores
• Podemos usar la anotación @RequestMapping para mapear URL’s contra una clase concreta o
contra un método determinado. además podemos definir el método HTTP necesario para invocar
el método:
@Controller
@RequestMapping("/cita")
public class CitaControlador {
private final CitaLibro citaLibro;
@Autowired
public CitaControlador(CitaLibro citaLibro)
{ this.citaLibro =citaLibro;
}
@RequestMapping(method = RequestMethod.GET)
public Map<String,Cita> get() {
returnCitaLibro.getCitaForToday();
}…
REST
GET
POST
• El protocolo HTTP dispone de siete
métodos, que son utilizados por la PUT
tecnología de tipo REST y que
cada uno tiene un significado, en TRACE
la plataforma.
DELETE
HEAD
OPTIONS
REST: verbos
<?xml version="1.0"?>
<recordings xmlns="…"> Representación en
<recording>…</recording> Tipo MIME
…
</recordings>
REST: implementación
Cliente REST
Spring MVC: configuración
• Desde Spring 3.0, se da soporte a las anotaciones de JSR-330 (Dependency Injection for Java),
como por ejemplo @Named y @Inject.
• La inyección de anotaciones se procesa antes, por esta razón, prevalece, la configuración en XML,
que pueda existir en caso de conflicto con lo que definan las anotaciones.
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd.”>
<context:annotation-config />
</beans>
Spring MVC: anotaciones
• Podemos dividir las anotaciones en varias familias, las genéricas o core, las que se usan con
Spring MVC, las de seguridad, las core son:
Anotación Descripción
@Required Specifies that a particular property must be injected or else the configuration will fail.
@Scope Specifies the scope of a bean, either singleton, prototype, request, session, or some
custom scope.
Spring MVC: anotaciones stereotype
• Estas anotaciones identifican el tipo de clase, si es un controlador, un servicio, se
diferencian semánticamente:
Anotación Descripción
@Component Generic stereotype annotation for any Spring-managed component
@Repository Stereotypes a component as a repository. Also indicates that SQLExceptions thrown from the
component’s methods should be translated into Spring DataAccessExceptions.
@Service Stereotypes a component as a service.
Anotaciones usadas en Spring MVC
• Desde la versión 2.5 de Spring, aparecen las anotaciones para Spring MVC, que facilitan el
desarrollo, minimizando las necesidades de declaraciones en archivos XML. Estas anotaciones son:
Anotación Descripción
@Controller Stereotypes a component as a Spring MVC controller.
@Transactional Declares transactional boundaries and rules on a bean and/or its methods
Anotación Descripción
Used on a setter or getter method to indicate that the bean’s property should
@ManagedAttribute be exposed as a MBean attribute.
Anotación Descripción
Declares that matching types should be given new parents—that is, it introduces new
@DeclareParents functionality into matching types
• La primera nos facilita el desarrollo de páginas que contienen formularios, mientras que la segunda
es de carácter general.
• La librería form “arropa” los componentes html estándar, añadiéndoles más funcionalidad,
como campos de entrada o botones .
option (s) Renders a single HTML option element inside a select element or inside a select element
Renders an HTML input element (or multiples) of the type radio button
radiobutton(s)
Renders an HTML input element (or multiples) of the type checkbox.
checkbox(es)
Renders an HTML Textarea element.
textarea
Displays binding and/or validation errors to the user. It can be used to either specify the
errors path for field-specific error messages or to specify an * to display all error messages.
Renders a HTML Label and associate it with an input element.
label
Renders an HTML Button element.
button
Spring MVC: librería de anotaciones <form>
• Cada etiqueta dispone a su vez, de atributos propios que permiten personalizar su funcionamiento.
Un ejemplo de formulario, se muestra a continuación:
message Displays a message with the given code and for the selected locale.
hasBindErrors Shows or hides part of the page (or element) based on whether an model attribute has bind errors.
Selects a nested path to be used by the bind tag’s path. For example, it can be used to bind
nestedPath customer.address to street instead of to customer.address.street.
bind Binds an attribute of the model (attribute) to the enclosed input element.
url Similar to the jstl core URL tag. It is enhanced so the URL can contain URL template
eval Evaluates a SpEL expression and prints the result or assigns it to a variable.
Spring MVC: soporte para HTML5
• Desde la versión 3.1 de Spring se proporciona soporte para la introducción de atributos dinámicos,
de esta forma podemos especificar atributos de HTML5.
• La etiqueta input soporta otras definiciones para el atributo type además del valor “text”, como
email, range, date y otros.
Renderizado y conversión de datos
• Conversores
• Formateadores
• Editores de propiedades
Renderizado y conversión de datos
• Los editores de propiedades son clásicos en Spring para llevar a cabo las
conversiones.
• Los editores de propiedades son clásicos en Spring para llevar a cabo las
conversiones.
• ConverterFactory
• Converter
• GenericConverter
• ConditionalGenericConverter
• Spring dispone de implementación más potentes que permiten realizar conversiones más
especializadas, como las del interface ConversionService.
•
Un ejemplo:
• Los formateadores de Spring son una API de propósito general, y pueden convertir de un tipo a otro
de objeto, aplicando incluso internacionalización.
• La API dispone del interface Formateer, a partir del cual incluso podemos crear nuestros
formateadores personalizados.
• Spring incorpora mecanismos de conversión para “enlazar” datos entre las propiedades de un bean
y por ejemplo los campos de un formulario, pero además, se usa en la inyección de dependencia.
• Por ejemplo:
• Otro caso donde se usa la conversión de datos es, cuando se reciben datos en parámetros HTTP,
que normalmente son asociados a un objeto Model, al cual son convertidos:
@RequestMapping("/pelicula/nuevo", method=RequestMethod.POST)
public String crear(@ModelAttribute Pelicula movie,
BindingResult results)
{ this.movieService.create(movie);
status.setComplete();
return "redirect:/peliculas";
}
• En estos casos los valores de tipo String son convertidos al del objeto definido como
argumento.
Validación de datos: JSR303
• Para poder aplicación la validación de la API JSR-303, debemos configurarlo en los archivos XML, con
la siguiente declaración:
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />
• Esto inicializa la API a sus valores por defecto, a continuación se espera que esté instalado un
proveedor JSR303 como Hibernate en el classpath, el cual será detectado automáticamente. También
podemos inyectar un validador así:
@Service
public class EjemploValidador {
@Autowired
private Validator validator;
}
Spring MVC: internacionalización de las vistas
Implementación Descripción
Uses the ResourceBundle facility available on the JVM. It
can only load resources from the classpath.
ResourceBundleMessageSource
• La internacionalización está basada en archivos de tipo properties, que incluyen las claves de
las etiquetas i18n de la capa de presentación.
Configuración i18n
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = { "com.pruebas.web" })
public class PruebasWebConfiguration extends WebMvcConfigurerAdapter {
@Bean
public MessageSource messageSource()
{ ReloadableResourceBundleMessageSource messageSource;
messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:/traducciones");
messageSource.setUseCodeAsDefaultMessage(true);
return messageSource;
}
}
Spring MVC: internacionalización de las vistas
• Para que este mecanismo de i18n, realice su trabajo correctamente es necesario configurar el
interface LocaleResolver, el cual dispone de varias implementaciones que se ajustan a las
necesidades de diferentes tipos de aplicación.
Implementación Descripción
Always resolves to a fixed locale. All the users of our website use the same
FixedLocaleResolver locale, so changing the locale isn’t supported.
Resolves (and stores) the locale in the user’s HttpSession. The attribute used
to store the locale can be configured, as well as the default locale to use if no
SessionLocaleResolver locale is present. The drawback to this is that the locale isn’t stored between
visits, so it must be set at least once on the user’s session.
Uses the http accept header to resolve the locale to use. In general, this is the
locale of the operating system of the user, so changing the locale isn’t
AcceptHeaderLocaleResolver
supported. It is also the default LocalResolver used by the DispatcherServlet.
Uses a cookie to store the user’s locale. The advantage of this resolver is
that the locale is kept on the client’s machine, so it will be available on
CookieLocaleResolver
subsequent visits to the website
Persitencia con
Spring Data
Spring data
• org.springframework.jdbc
• org.springframework.dao
Spring data: módulo jdbc/dao
• La API de Spring para trabajar con bases de datos consta de los siguientes paquetes
importantes:
Package Descripción
org.springframework.jdbc Define las clases básicas, como excepciones para trabajar con BBDD
org.springframework.jdbc.core Contiene las clases fundamentales como JdbcTemplate para acceso a datos
org.springframework.jdbc.core.simple Contiene versiones simplificadas de JdbcTemplate para trabajar con JDK5
org.springframework.jdbc.datasource Proporciona soporte para trabajar con datasources
org.springframework.jdbc.support Contiene clases de soporte simplificado como JdbcDaoSupport
org.springframework.dao Define una jerarquía sofisticada de excepciones sobre las de JDBC
org.springframework.dao.support Clases de soporte para trabajar con DAO
• Spring encapsula las excepciones JDBC/ORM a tipo RuntimeException, de esta forma, no son
necesarias capturarlas todas, pero si decidir cuales serán gestionadas.
Spring data: templates
• JdbcTemplate
• HibernateTemplate
• JdoTemplate…
• También es posible optar por usar las Templates de Spring en lugar de las clases XXXDaoSupport.
• JdbcDaoSupport
• HibernateDaoSupport
• JdoDaoSupport…
• Para utilizar Spring con JDBC, lo primero que es necesario hacer es configurar el acceso a la BBDD
en el archivo de configuración XML.
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource"
p:driverClassName="com.mysql.jdbc.Driver"
p:url="jdbc:mysql://localhost:3306/test"
p:username="root"
p:password="password"/>
• En este mismo archivo podemos declarar un bean que hereda de JdbcDaoSupport y al que
le inyectamos una propiedad «dataSource».
• Para utilizar Spring con JDBC, usando un pool de conexiones que ha sido configurado en
JNDI, podemos hacer uso de el con esta configuración:
• JPA utiliza un archivo XML para su configuracin, aunque es posible hacerlo por cdigo.
Sublementos
description
provider
properties
jta-data-source o non-jta-data-source
exclude-unlisted-classes
shared-cache-mode
validation-mode
Spring data: configuracion JPA
</persistence>
Spring data: implementacion JPA
• Por su parte la clase EntityManager se obtiene a partir de la factoría y es parecida a la clase Session
de Hibernate, cada instancia representa una conexión con la BBDD.
Eliminar remove(entidad)
Spring data: implementacion JPA
• Podemos crear una instancia de la clase EntityManager de varias formas, por ejemplo, usando
un POJO o un EJB.
…………………………………………………………………………………………
@Stateless
public class EjemploServiceBean implements EjemploService
{ @PersistenceContext(unitName="EmpleadoService")
EntityManager em; EJB 3 creando
un objeto
public void ainsertarEmpleado(int empId, int proyectoId) EntityManager
{ Proyecto proyecto = em.find(Proyecto.class, proyectoId); por inyección
Empleado empleado = em.find(Empleado.class, empId);
de dependencia
JPA: operaciones
• Las operaciones más importantes, que podemos realizar sobre la entidad(es) con las que
trabajamos son las siguientes:
find Busca una entidad ejecutando una consulta por PK sobre la BBDD
• Todas ellas influyen sobre el PersistentContext y tienen un impacto importante sobre el estado de
la instancia con la que trabajamos.
Otros persistence providers: Eclipselink
• En su lugar se configura un pool de conexiones que están abiertas y que una vez ha utilizado la
aplicación, se devuelven al pool sin necesidad de cerrarlas físicamente, de esta forma se
incrementa sustancialmente el rendimiento.
Thread 1
Thread 2
Thread 3
Pooling 1
Thread 4
Thread 5
Thread 6
Thread 7
Thread n…
JPA: el objeto EntityManager
• Internamente consta de una caché de primer nivel o L1 a la que puede añadirse otra de segundo
nivel o L2.
JPA
Entity Caché
Aplicación Primer nivel
Manager
Caché
Segundo nivel
opcional
JPA: ciclo de vida de una entidad
• Estados por los que pasa una entidad usada en JPA.
merge
persist
remove
Managed
persist
merge
final de transacción
Serialización o
persist
Removed
merge
New
remove
merge
remove
Detached remove
Fails
JPA: ciclo de vida de una entidad
• Los cambios de estado de la entidad según la operación que se realiza sobre ella, son los
siguientes:
Estado antiguo Operación realizada Estado actual
No existe aún Creamos una nueva instancia con el operador new New
• Los estados que va adquiriendo la instancia al ser afectada por cada operación tiene un
impacto importante sobre el código que escribimos.
Hibernate: ciclo de vida de una entidad
• Estados por los que pasa una entidad usada en Hibernate.
flush
get
find
load Persistent
persist
saveOrUpdate
save
close
update clear
new Transient lock evist
saveOrUpdate delete
replicate
merge
Detached
JpaRepository
• Hibernate dispone de su propio lenguaje de consulta que se comporta como una capa más
de aislamiento. En este caso, quiere aislarse de las implementaciones propias que cada motor de
base de datos hace del estándar SQL-92.
from usr.Usuario
from Usuario
• Esta sentencia, devolverá todas las instancias de la clase Usuario, podemos calificarla o no,
es opcional.
JQL y HQL
• Podemos hacer referencia a más de una clase, creando una unión cartesiana,
como:
• Para realizar una consulta que contenga a otra (subquery) en JPQL/HQL, podemos
escribirla así:
from Cat as fatcat
where fatcat.weight > (
select avg(cat.weight )
from DomesticCat cat )
JQL y HQL
• Hibernate/JPA da soporte a un conjunto de operaciones para que puedan ser realizadas con
el atributo cascade, como por ejemplo:
lock reverse
• Podemos propagar una de estas tareas entre una instancia y todas sus relaciones hijo,
definiendo en el archivo de mapping o usando anotaciones.
JQL y HQL
• Los valores que podemos otorgar al atributo cascade, para que Hibernate/JPA sepa
como tratar la entidad relacionada en una operación que afecte a su persistencia, son
los siguientes:
Atributo Descripción
Igual al atributo «all» pero añade el borrado de una entidad que ha sido borrada
all-delete-orphan
de la asociación
• One-to-one
• One-to-many
• Many-to-one
• Many-to-many
• La asociación One-to-one puede mantener la relación en la propia tabla, ya que cada registro sólo
está asociado/relacionado con un único registro.
Transacciones
• Una transacción es una unidad de trabajo y que se comporta como si tuviéramos un uso
exclusivo de la base de datos. Por esta razón, el modelo transaccional que implementemos
en nuestra aplicación es de extrema importancia, decidirá realmente su rendimiento general.
Hibernate cumple con lo que se denomina el modelo ACID, que consta:
• Consistency, sólo los datos válidos son escritos en la BBDD, si por alguna razón la operación no se puede completar
• Durability, Una operación con éxito queda escrita en la BBDD de forma persistente.
Transacciones
• Podemos mostrar el ciclo de vida de una transacción en un diagrama de estados UML, con
los posibles estados:
• Como unidad atómica, el resultado debe ser consistente y sino tiene éxito las cosas
deben quedar como estaban antes de iniciar la transacción.
Transacciones
• El envío de una gran cantidad de datos en una llamada (a través de la solicitud HTTP) puede provocar el corte
de la comunicación.
• Demasiadas llamadas simultáneas a un endpoint podrían aplicar demasiada “presión” sobre la aplicación
y provocar que falle.
• La red admite las peticionesHTTP y la red nunca es 100% fiable. Siempre existe la posibilidad de que
una invocacion a un endpoint REST falle debido a la red.
Spring REST services: implementación
En este ejemplo anotamos la clase del controlador con la anotacion @Controller. De esta forma, una
instancia de la clase se convierte en un bean en el contexto de Spring (igual que en Spring MVC) y asi
sabe que este es un controlador que asigna sus métodos a rutas HTTP específicas REST.
• @RestController le indica a Spring que todos los controladores son endpoints REST.
Retorno de objetos desde el controlador
• Spring crea una representación de cadena del objeto y lo formatea como JSON.
• La notación de objetos JavaScript (JSON) es una forma sencilla de formatear cadenas como
parejas
atributo-valor.
Retorno de una lista de objetos
• El controlador nos permite devolve una lista de objetos, simplemente cambiando el tipo de
retorno de datos por una collection generica.
Recuperar datos del cliente usando @RequestBody
• Los web services de Spring se apoyan en los mismos mecanismos del módulo MVC, por ello,
podemos utilizar las mismas anotaciones para llevar a cabo acciones similares como la
obtención de datos enviados en la petición del cliente.
Invocando un web service endpoint
Invocando un web service endpoint
Invocando un web service endpoint: implementacion
Retorno usando status code
• Normalmente al generar una respuesta en un tipo de formato MIME, debemos aconpañarla con
un
status code de la familia 100-500, para ello, usamos la clase ResponseEntity.
• La gestión de
excepciones en un
web service es
responsabilidad del
controlador y para
capturar resolver la
excepción ussaremos
un código como el
propuesto a la
derecha.
Una pestaña por URL REST
Postman app: Metodo HTTP
peticion web
www.getpostman.com/downloads
• @RestController
• @GetMapping.
Spring boot CLI: autoconfiguracion
• La configuración automática es
una de las características mas
importantes de Spring Boot porque
permite crear una aplicación Spring
Boot de acuerdo con su classpath,
anotaciones y cualquier otro tipo
de configuracion basada en
anotaciones o declaraciones de
configuración, como clases
JavaConfig o XML.
Spring boot CLI: autoconfiguracion
• @Configuration
• @ComponentScan
• @EnableAutoConfiguration.
• @EnableAutoConfiguration
@SpringBootApplication.
Spring boot MVC: autoconfiguracion
• spring-boot-starter-web
• @Configuration
• @EnableAutoConfiguration
• @ComponentScan
• Po la anotacion @SpringBootApplication,
que sustituye al resto.
Spring boot: starters
• Spring Boot proporciona una serie de iniciadores
que nos permiten agregar jar en la ruta de clases.
• En MyUserDetailService simplemente
sobrescribimos el método
loadUserByUsername() que recibe el nombre de
usuario como parámetro.
Spring security: implementación
• isAccountNotLocked()
• isCredentialsNonExpired()
• isEnabled()
Spring security: flujo
Cuando se inicia la aplicación:
• Exchanges (intercambios, son como oficinas o buzones de correos donde los clientes
publican mensajes en un exchange AMQP.
• Los mensajes se envían a una centralita con una clave de enrutamiento, luego, el
exchange distribuye copias de los mensajes a las colas.
Spring AMQP
Spring AMQP
• Spring proporciona utilidades para trabajar con RabbitMQ como la clase RabbitAdmin, que
permite declarar: colas, exchanges y bindings.
• Configuracion de listeners para procesar asincronamente mensages que llegan.
• La clase RabbitTemplate para enviar y recibir mensajes.
Usando la clase RabbitAdmin
- src/main/resources/application.properties
- spring.social.twitter.appId=xxxxxxxxxxxxxxxxx
- spring.social.twitter.appSecret=xxxxxxxxxxxxxxxxxxxxxxxxx