Publicado el 13 de Febrero del 2019
785 visualizaciones desde el 13 de Febrero del 2019
662,9 KB
26 paginas
Creado hace 12a (01/01/2012)
Experto Universitario Java Enterprise
Spring
Sesión 6: Acceso remoto. Pruebas
Experto Universitario Java Enterprise
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
Experto Universitario Java Enterprise
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
Experto Universitario Java Enterprise
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
Experto Universitario Java Enterprise
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
Experto Universitario Java Enterprise
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
Experto Universitario Java Enterprise
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
Experto Universitario Java Enterprise
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
Experto Universitario Java Enterprise
Esquema en el servidor
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
9
Experto Universitario Java Enterprise
Esquema en el cliente
ClaseCliente
Proxy
a IGestorPedidos
JVM cliente
beans-importados.xml
<<Interface>>
IGestorPedidos
beans-remotos.xml
GestorPedidos
beans-negocio-datos.xml
Contenedor web (p.ej. Tomcat)
GestorPedidosExporter
PedidosDAO
Acceso remoto. Pruebas
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring
10
Experto Universitario Java Enterprise
Ejemplo
• Queremos acceder remotamente a este bean
Acceso remoto. Pruebas
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring
11
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]; }}
Experto Universitario Java Enterprise
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
Experto Universitario Java Enterprise
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
• 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
<bean name="/saludadorHTTP" class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter"> <property name="service" ref="saludador"/> <property name="serviceInterface" value="servicios.ServicioSaludo"/></bean
Experto Universitario Java Enterprise
HTTP invoker en el cliente
• Llamar al bean remoto desde Java
• Fichero “clienteHTTP.xml”
Acceso remoto. Pruebas
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring
14
ClassPathXmlApplicationContext contexto = new ClassPathXmlApplicationContext("clienteRMI.xml");ServicioSaludo ss = contexto.getBean(ServicioSaludo.class);System.out.println(ss.getSaludo());<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>
Experto Universitario Java Enterprise
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
Experto Universitario Java Enterprise
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
Experto Universitario Java Enterprise
Pruebas unitarias
• Clase a probar: UsuariosDAOJDBC, que implementa la interfaz:
• Clase de prueba
Acceso remoto. Pruebas
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring
17
public interface IUsuariosDAO { public List<Usuario> listar(); public Usuario getUsuario(String login); public void alta(Usuario u); ...}@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()); }}
Experto Universitario Java Enterprise
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”
Acceso remoto. Pruebas
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring
18
<!-- 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"/>
Experto Universitario Java Enterprise
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
Acceso remoto. Pruebas
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring
19
<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)@Transactionalpublic class UsuariosDAOTest {
Experto Universitario Java Enterprise
Pruebas de integración
• Spring resuelve las dependencias, como “en producción”
Acceso remoto. Pruebas
© 2012-2013 Depto. Ciencia de la Computación e IA
Spring
20
public interface IUsuariosBO { //Este método debe comprobar que el password coincide co
Comentarios de: Sesión 6: Acceso remoto. Pruebas - Spring (0)
No hay comentarios