Experto Universitario Java Enterprise Spring



Documentos relacionados
Experto Universitario Java Enterprise Spring

JAVA EE 5. Arquitectura, conceptos y ejemplos.

Modelo de Objetos Distribuidos

Desarrollo de Servicios Web con JBuilder

Ejercicios de AJAX y REST

Manual del Protocolo XML-RPC de Mensajería Negocios

Solución de firma de pdf (Servidor) PDF_SIGN Versión 1.4

Práctica 2: Java Remote Method Invocation (RMI)

Curso de Java POO: Programación orientada a objetos

Requisitos. Universidad ORT Arquitectura de Software

Ejercicio 4. EJB Sesión - Sistema SGA. Java EE. Ejercicio 4. EJB Sesión Sistema SGA. Curso de Java EE

Introducción a JAX-WS Web Services

Ingeniería del Software Arquitectura Física en 3 niveles

Curso de JavaServer Faces

Tema 6: Comparativa CORBA/Servicios Web

Configuración servidor Tomcat

1. Visión general de RMI

Lenguaje Java Avanzado

BETA. Sacándole Partido a JUnit. Mocking. formacion@iwt2.org

Administración Local Soluciones

SIEWEB. La intranet corporativa de SIE

Spring. Sesión 7: Seguridad con Spring Security. Experto Universitario Java Enterprise

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

Manual de NetBeans y XAMPP

Java RMI. Sistemas Distribuidos Rodrigo Santamaría

Arquitectura. 1.- Aplicaciones Web. Definición. Arquitectura clásica. Contenidos. 1.- Aplicaciones Web

Universidad ORT - Arquitectura de Software. Requisitos

Pruebas de unidad con JUnit

Facturación Automática de Ventas WhitePaper Noviembre de 2006

La interoperabilidad se consigue mediante la adopción de estándares abiertos. Las organizaciones OASIS y W3C son los comités responsables de la

Se ha confeccionado una aplicación sencilla para poder probar el interfaz de gestión explotación de MEGA, Modelo Estandarizado de Gestión de Agua.

SERVIDOR WEB PARA ACCESO EN TIEMPO REAL A INFORMACIÓN METEOROLÓGICA DISTRIBUIDA

RMI [Remote Method Invocation]

RUEDA TORRES DULCE CAROLINA 3CM2 JAX-WS WEB SERVICES WEB APPLICATION DEVELOPMENT

Instalación y mantenimiento de servicios de Internet. U.T.3.- Servicio DNS

Curso de Spring Framework

Programación Orientada a Objetos con Java

ATLAS MANUAL DE INTEGRACIÓN Cliente del Servicio de SMS

Introducción a PHP. * No es necesario declarar previamente las variables.

Especialista Universitario Java Enterprise. Struts. Sesión 4: Introducción a Struts Depto. Ciencia de la Computación e IA

FRAMEWORK SPRING EN UNA APLICACIÓN WEB

Instalar protocolo, cliente o servicio nuevo. Seleccionar ubicación de red. Práctica - Compartir y conectar una carpeta

Capitulo 5. Implementación del sistema MDM

Llamada a métodos remotos (RMI). Curso 04/05. Tema 9. Departament d Informàtica. Universitat de València. 1. Introducción 2

UNIDAD DIDACTICA 16 USUARIOS SAMBA EN UN CONTROLADOR DE DOMINIO LINUX SERVER

El lenguaje de programación Java

Modulo I. Introducción a la Programación Web. 1.1 Servidor Web.

Software de Comunicaciones. Práctica 7 - Secure Shell. SSH

Manual de Instalación

Práctica sobre compartición de instancias remotas.

Un poco de culturilla...1 Crear un servicio Web...1 Usar servicios web...6

TUTORIAL DESARROLLO DE APLICACIONES PARA EVOLUTION CON MS ACCESS

JAVA ENTERPRISE EDITION (J2EE) ARQUITECTURA TECNOLOGÍAS (1/2) (L1)

Podemos descargar la distribucion de gnu/linux de los repositorios de Ubuntu

Dossier de prácticas

MANUAL COPIAS DE SEGURIDAD

Práctica 5: Common Object Request Broker Architecture CORBA

UNIVERSIDAD DE PIURA

Seguridad no intrusiva con Acegi Security System for Spring

Requisitos técnicos para la instalación. Arquitectura Hardware Arquitectura Software. Instrucciones de instalación GONG-R

Conectar a unidad de red

GUÍA TÉCNICA. Desarrollo de Sistemas de Información la plataforma Business Intellingence Pentaho

Práctica GESTIÓN Y UTILIZACIÓN DE REDES LOCALES. Curso 2001/2002. TCP/IP: protocolo TCP

Introducción a las Redes de Computadoras. Obligatorio

Laboratorio de PCs. Práctica 3: Montaje de una red de Área local

Desarrollo de Sistemas Software Basados en Servicios y Componentes

UNIDESYS UNIVERSAL BUSINESS SYSTEMS INSTALACIÓN NUEVO PUESTO DE TRABAJO

Tema 3. Test Driven Development

Guía de uso del Cloud Datacenter de acens

Utilidades para el control de stock de los artículos

Seguridad de la aplicación para servlets y JSP (página activas java)

Primera Escuela de la Red Temática SVO. Madrid, Noviembre, 2006 JAVA BÁSICO. Raúl Gutiérrez Sánchez LAEFF - INTA raul@laeff.inta.

ÍTEMS DEL MENÚ CREACIÓN Y GESTIÓN (Última revisión: lunes, 9 de marzo de 2009)

LABORATORIO DE RC: PRÁCTICA 4: IMPLEMENTACIÓN DE UN CLIENTE DE CORREO

Notas técnicas de JAVA Nro. 7 Tip Breve

ATLAS MANUAL DE USUARIO SERVICIO DE TRAZAS

ALTAS MANUAL DE USUARIO DEL SERVICIO DE CERTIFICADOS

Instalar y configurar W3 Total Cache

Ejercicios - Persistencia en Android: proveedores de contenidos y SharedPreferences

Manual de instalación Actualizador masivo de Stocks y Precios

Guia rápida EPlus Cliente-Servidor

Tema 4: Tecnologías Web Java

MICQ. Trabajo Práctico Final Seminario de Ingeniería en Informática I Facultad de Ingeniería, UBA. Junio Cátedra: Pablo Cosso

Laboratorio de Redes y Sistemas Operativos Trabajo Práctico Final

TFC J2EE. Aplicación Web para la gestión de facturación de una empresa de cerrajería. Sara Gutiérrez Melero ITIG Junio de 2012

Servicio de Notificaciones Electrónicas y Dirección Electrónica Habilitada

Desarrollo de Aplicaciones Web con JAVA: J2EE y Struts

Guía Rápida de Inicio

Ejemplos básicos de webmathematica para profesores

Práctica 4: Java Remote Method Invocation (RMI)

Agosto. Un primer JSP. Guía rápida. [ h t t p : / / w w w. o p e n b o x e r m b. c o m / j a v a. p h p ]

Qué es Glassfish? Características de Glassfish (2) Características de Glassfish

Transcripción:

Spring Sesión 6: Acceso remoto. Pruebas

Indice Spring para acceso remoto Spring vs. EJB Comparación de los protocolos disponibles Acceso remoto con HttpInvoker Pruebas Acceso remoto. Pruebas 2012-2013 Depto. Ciencia de la Computación e IA Spring 2

Acceso remoto en Spring Hacer accesibles nuestros métodos y clases de negocio desde otras máquinas (no solo a través de la capa web) Por qué acceso remoto? Clientes ricos (Swing, etc) Servicios web Aplicaciones distribuidas Spring tiene ciertas limitaciones, relativas sobre todo a transacciones distribuídas que impliquen objetos remotos. Para eso necesitaremos EJBs Acceso remoto. Pruebas 2012-2013 Depto. Ciencia de la Computación e IA Spring 3

Opciones en Spring para acceso remoto RMI Clientes Java, eficiente, problemas con firewalls Hessian y Burlap Clientes en varios lenguajes, eficiencia media, firewall friendly HTTP invoker Clientes Spring, eficiencia media, firewall friendly Servicios web SOAP Estandarización, portabilidad máxima en cuanto a clientes, poca eficiencia, firewall friendly Servicios web REST: Superan el coste computacional de los SOAP pero a cambio requieren más trabajo manual Acceso remoto. Pruebas 2012-2013 Depto. Ciencia de la Computación e IA Spring 4

REST vs Otros protocolos En Spring, RMI, HttpInvoker, Hessian y Burlap comparten una filosofía subyacente común Tenemos un objeto remoto que nos da servicios (métodos) y accedemos a ellos como si fuera un objeto local Misma filosofía que en EJBs, como ya veréis en la parte enterprise REST es distinto Realizamos operaciones prefijadas con las entidades (Create/Read/Update/Delete) Acceso remoto. Pruebas 2012-2013 Depto. Ciencia de la Computación e IA Spring 5

Indice Spring para acceso remoto Spring vs. EJB Comparación de los protocolos disponibles Acceso remoto con HttpInvoker Pruebas Acceso remoto. Pruebas 2012-2013 Depto. Ciencia de la Computación e IA Spring 6

Conceptos básicos Exporter: en el servidor. Es un bean de Spring que nos permite exportar el servicio Lo asociará a una URL (un endpoint ) ProxyFactoryBean: en el cliente. Es un bean de Spring que implementa el mismo interfaz al que queremos acceder y que actúa de proxy Llamamos a un objeto local y él delega esa llamada en un objeto remoto, escondiendo los detalles de la comunicación Acceso remoto. Pruebas 2012-2013 Depto. Ciencia de la Computación e IA Spring 7

Muy importante El bean al que queremos acceder de forma remota debe implementar un interface Lo que veremos desde el cliente es el interface, no la implementación Esto nos permitirá tener un interface local y uno remoto (con menos operaciones, posiblemente) <<Interface>> IGestorPedidos <<Interface>> IGestorPedidosRemoto GestorPedidos Acceso remoto. Pruebas 2012-2013 Depto. Ciencia de la Computación e IA Spring 8

Esquema en el servidor GestorPedidosExporter beans-remotos.xml GestorPedidos beans-negocio-datos.xml PedidosDAO Contenedor web (p.ej. Tomcat) Acceso remoto. Pruebas 2012-2013 Depto. Ciencia de la Computación e IA Spring 9

Esquema en el cliente ClaseCliente Proxy a IGestorPedidos JVM cliente beans-importados.xml <<Interface>> IGestorPedidos GestorPedidosExporter beans-remotos.xml GestorPedidos beans-negocio-datos.xml Contenedor web (p.ej. Tomcat) PedidosDAO Acceso remoto. Pruebas 2012-2013 Depto. Ciencia de la Computación e IA Spring 10

Ejemplo Queremos acceder remotamente a este bean package servicios; public interface ServicioSaludo { public String getsaludo(); package servicios; @Service("saludador") public class ServicioSaludoImpl implements ServicioSaludo { String[] saludos = {"hola, qué tal?", "me alegra verte", "ola k ase"; public String getsaludo() { int pos = (int)(math.random() * saludos.length); return saludos[pos]; Acceso remoto. Pruebas 2012-2013 Depto. Ciencia de la Computación e IA Spring 11

HTTP invoker en el servidor Inconveniente: el cliente debe ser Java y además requiere las librerías de Spring La comunicación con el cliente se hace a través de un servlet Así se puede acceder al servicio remoto por HTTP La implementación del servlet ya está hecha en Spring (clase DispatcherServlet, misma que usábamos en MVC) Se asocian ciertas URL con el servlet en el web.xml Acceso remoto. Pruebas 2012-2013 Depto. Ciencia de la Computación e IA Spring 12

HTTP invoker en el servidor (II) El fichero de definición de beans exportados se debe llamar por defecto igual que el servlet seguido de -servlet.xml (y estar en WEB-INF) En nuestro ejemplo debe ser remoting-servlet.xml En él se define/n el/los exporter, bean/s de la clase HttpInvokerServiceExporter <bean name="/saludadorhttp" class="org.springframework.remoting.httpinvoker.httpinvokerserviceexporter"> <property name="service" ref="saludador"/> <property name="serviceinterface" value="servicios.serviciosaludo"/> </bean El endpoint será http://localhost:8080/mi_aplicacion/remoting/saludadorhttp Acceso remoto. Pruebas 2012-2013 Depto. Ciencia de la Computación e IA Spring 13

HTTP invoker en el cliente Llamar al bean remoto desde Java ClassPathXmlApplicationContext contexto = new ClassPathXmlApplicationContext("clienteRMI.xml"); ServicioSaludo ss = contexto.getbean(serviciosaludo.class); System.out.println(ss.getSaludo()); Fichero clientehttp.xml <bean id="httpproxy" class="org.springframework.remoting.httpinvoker.httpinvokerproxyfactorybean"> <property name="serviceurl" value="http://localhost:8080/miaplicacion/remoting/saludadorhttp"/> <property name="serviceinterface" value="servicios.serviciosaludo"/> </bean> Acceso remoto. Pruebas 2012-2013 Depto. Ciencia de la Computación e IA Spring 14

Indice Spring para acceso remoto Spring vs. EJB Comparación de los protocolos disponibles Acceso remoto clásico HttpInvoker Pruebas Acceso remoto. Pruebas 2012-2013 Depto. Ciencia de la Computación e IA Spring 15

Soporte de Spring para pruebas Para pruebas unitarias/de integración Uso de un fichero de configuración/perfil distinto al de producción Resolución de dependencias Para pruebas de objetos de acceso a datos Soporte de bases de datos embebidas Transaccionalidad automática Para pruebas de la capa web Pruebas fuera del contenedor web Acceso remoto. Pruebas 2012-2013 Depto. Ciencia de la Computación e IA Spring 16

Pruebas unitarias Clase a probar: UsuariosDAOJDBC, que implementa la interfaz: public interface IUsuariosDAO { public List<Usuario> listar(); public Usuario getusuario(string login); public void alta(usuario u);... Clase de prueba @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:config/daos-test.xml") public class UsuariosDAOTest { //Spring nos da la instancia del DAO a probar @Autowired IUsuariosDAO dao; //Esto ya no tiene nada de particular de Spring @Test public void testlistar() { List<Usuario> lista = dao.listar(); assertequals(10, lista.size()); Acceso remoto. Pruebas 2012-2013 Depto. Ciencia de la Computación e IA Spring 17

Fichero de configuración para pruebas Base de datos embebida (por defecto HSQLDB) Almacena los datos en memoria, pruebas más rápidas Por ahora, el resto igual que en producción <!-- conexión con la BD de pruebas --> <jdbc:embedded-database id="midatasource"> <jdbc:script location="classpath:db.sql"/> <jdbc:script location="classpath:testdata.sql"/> </jdbc:embedded-database> <!-- los DAOs están en este package --> <context:component-scan base-package="es.ua.jtech.spring.datos"/> Acceso remoto. Pruebas 2012-2013 Depto. Ciencia de la Computación e IA Spring 18

Transaccionalidad en pruebas Deshace automáticamente los efectos de las pruebas ejecutadas Util para dejar la BD en un estado conocido Debemos declarar un gestor de transacciones en el fichero de configuración de pruebas <jdbc:embedded-database id="midatasource"> <jdbc:script location="classpath:db.sql"/> <jdbc:script location="classpath:testdata.sql"/> </jdbc:embedded-database> <bean id="txmanager" class="org.springframework.jdbc.datasource.datasourcetransactionmanager"> <!-- importante: este "ref" coincide con el "id" del datasource --> <property name="datasource" ref="midatasource"/> </bean> @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:config/daos-test.xml") @TransactionConfiguration(transactionManager = "txmanager", defaultrollback = true) @Transactional public class UsuariosDAOTest { Acceso remoto. Pruebas 2012-2013 Depto. Ciencia de la Computación e IA Spring 19

Pruebas de integración Spring resuelve las dependencias, como en producción public interface IUsuariosBO { //Este método debe comprobar que el password coincide con lo que devuelve el DAO //si no lo hace, devolverá null public Usuario login(string login, String password); //Estos métodos delegan el trabajo en el DAO public List<Usuario> listar(); public void alta(usuario u); @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations={"classpath:config/daos-test.xml", "classpath:config/bos-test.xml") public class UsuariosBOTest { @Autowired IUsuariosBO ubo; @Test public void testlogin() { //el usuario "experto" sí está en la BD assertnotnull(ubo.login("experto", "experto")); //pero no el usuario "dotnet" ( jamás!) assertnull(ubo.login("dotnet", "dotnet")); Acceso remoto. Pruebas 2012-2013 Depto. Ciencia de la Computación e IA Spring 20

Pruebas de integración con mocks Mockito import static org.mockito.mockito.*; //creamos el mock IUsuariosDAO udaomock = mock(iusuariosdao.class); //Creamos un usuario de prueba con login "hola" y password "mockito" Usuario utest = new Usuario("hola", "mockito"); //grabamos el comportamiento del mock when(udaomock.getusuario("hola")).thenreturn(utest); //imprime el usuario de prueba System.out.println(udaoMock.getUsuario("hola")); Acceso remoto. Pruebas 2012-2013 Depto. Ciencia de la Computación e IA Spring 21

Pruebas de integración con mocks (II) Sustituir UsuariosDAOJDBC que implementa IUsuariosDAO por el mock En el fichero de configuración de beans para la capa DAO <bean id="usuariodao" class="org.mockito.mockito" factory-method="mock"> <constructor-arg value="es.ua.jtech.dao.iusuariosdao" /> </bean> Especificar el comportamiento del mock @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations={"classpath:config/daos-mock-test.xml", "classpath:config/bos-test.xml") public class UsuariosBOMockTest { @Autowired IUsuariosBO ubo; @Autowired IUsuariosDAO udao; @Before public void setup() { when(udao.getusuario("test")).thenreturn(new Usuario("test","test")); @Test public void testlogin() { assertnotnull(ubo.login("test", "test")); assertnull(ubo.login("experto", "experto")); Acceso remoto. Pruebas 2012-2013 Depto. Ciencia de la Computación e IA Spring 22

Pruebas de la capa web Funcionalidad añadida en la última versión de Spring (3.2). Antes estaba en un proyecto aparte Podemos probar los controller sin necesidad de desplegar la aplicación en un contenedor web Podemos comprobar el código de estado devuelto por el servidor, el contenido de la respuesta (para AJAX/REST), el nombre de la vista a la que se intenta saltar (para JSP y similares), el contenido del modelo... Lo único que no se puede probar son los JSP, requieren de un contenedor web Ejemplo (luego veremos la sintaxis con más detalle) @Controller public class HolaSpringController { @RequestMapping("/hola") public @ResponseBody String hola() { return "Hola Spring"; @Test public void testhola() throws Exception { this.mockmvc.perform(get("/hola")).andexpect(status().isok()).andexpect(content().string("hola Spring")); Acceso remoto. Pruebas 2012-2013 Depto. Ciencia de la Computación e IA Spring 23

Clase de pruebas para la capa web Necesitamos un MockMVC, que se construye a partir de un WebApplicationContext Necesitaremos referenciar también un fichero de configuración de la capa web (puede ser el mismo de producción) @RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration @ContextConfiguration(locations={"classpath:config/web-test.xml", "classpath:config/daos-test.xml", "classpath:config/bos-test.xml") public class HolaSpringControllerTest { @Autowired private WebApplicationContext wac; private MockMvc mockmvc; @Before public void setup() { this.mockmvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); //ahora vienen los test, un poco de paciencia...... Acceso remoto. Pruebas 2012-2013 Depto. Ciencia de la Computación e IA Spring 24

Ejemplos de pruebas de controllers Hacer la petición //hacer peticiones HTTP y especificar el tipo MIME mockmvc.perform(get("/usuarios/").accept(mediatype.application_json)); //enviar parámetros HTTP (/verusuario?login=experto) mockmvc.perform(get("/verusuario").param("login", "experto")); //Peticiones REST this.mockmvc.perform(put("/usuarios/{id", 42).content("{'login':'experto', 'password':'experto'")); Comprobar la respuesta //Comprobar la vista this.mockmvc.perform(post("/login").param("login","experto").param("password", "123456")).andExpect(view().name("home")); //Comprobar el modelo this.mockmvc.perform(get("/usuarios/experto")).andexpect(model().size(1)).andexpect(model().attributeexists("usuario")).andexpect(view().name("datos_usuario")); //Comprobar el modelo this.mockmvc.perform(get("/usuarios/experto").accept("application/json;charset=utf-8")).andexpect(status().isok()).andexpect(content().contenttype("application/json")).andexpect(jsonpath("$.localidad").value("alicante"); Acceso remoto. Pruebas 2012-2013 Depto. Ciencia de la Computación e IA Spring 25

Preguntas...? Acceso remoto. Pruebas 2012-2013 Depto. Ciencia de la Computación e IA Spring 26