JAX-WS: Generando un cliente de WS con SoapUI

Vamos a generar las clases necesarias para generar un cliente de un Web Service a partir de su WSDL.

Nos basaremos en el proyecto HelloWorld de hace unas semanas, y aquí le añadimos seguridad. En este proyecto devolvíamos el saludo según el nombre que nos pasaban como parámetro a través del Web Service.

Read the rest of this entry »

JAX-WS Handler Chain: Interceptando los mensajes

Queremos interceptar el WS en la salida y la entrada. Esto puede ser útil para:

  • Hacer log de alguna parte del mensaje
  • Llevar registro de mensajes enviados
  • Controles de seguridad añadidos
  • ….

Hoy vamos a hacer un ejemplo de log de la entrada/salida del WS.

Anotamos el WS con el descriptor de la cadena de manejadores:

@WebService
@HandlerChain(file="src/META-INF/handlerChain.xml")
public class Hello {
@WebMethod
    public String sayHello(String name) {
        return "Hello, "+name+".";
    }
}

Que tendrá el contenido siguiente:

<?xml version="1.0" encoding="UTF-8"?>
<handler-chains xmlns="http://java.sun.com/xml/ns/javaee">  
   <handler-chain>  
      <handler>  
         <handler-class>lebrijo.handlers.WSHandler</handler-class>  
      </handler>  
   </handler-chain>  
</handler-chains>

La clase WSHandler implementará la interfaz SOAPHandler:

public class WSHandler implements SOAPHandler<SOAPMessageContext> {  
 
     public Set<QName> getHeaders() {  
         return null;  
     }  
 
     public boolean handleFault(SOAPMessageContext context) {  
         logToSystemOut(context);  
         return true;  
     }  
 
     public boolean handleMessage(SOAPMessageContext context) {  
         logToSystemOut(context);  
         return true;  
     }  
 
     private void logToSystemOut(SOAPMessageContext smc) {  
         Boolean outboundProperty = (Boolean) smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);  
 
         if (outboundProperty.booleanValue()) {  
             System.out.println("\nOutgoing message:");  
         } else {  
             System.out.println("\nIncoming message:");  
         }  
 
         SOAPMessage message = smc.getMessage();  
         try {  
             message.writeTo(System.out);  
         } catch (Exception e) {  
             System.out.println("Exception in handler: " + e);  
         }  
     }
 
	public void close(MessageContext context) {
		// TODO Auto-generated method stub
 
	}

Diseño: plantillas y estilos con ADF

Normalmente en todos los proyectos web, queremos que todas las páginas tengan una apariencia coherente en todo nuestro sitio, para mejorar la usabilidad. Lo más habitual en web es poner como parte fija la cabecera (con el login por ejemplo), un menú en la parte superior o lateral, y un pié:

  • Y que estas partes (que forman la plantilla) se incluyan en todas las páginas que desarrollemos sin necesidad de volver a repetir todo.
  • Que cualquier modificación sobre la plantilla se refleje automaticamente en todo nuestro sitio, sin tocar el resto.
  • Y, si es posible, en mi editor WYSIWYG se vea todo (esto en Eclipse no es posible de momento).

Read the rest of this entry »

JPA: modelo de persistencia

En este artículo crearemos un modelo de persistencia para nuestra pequeña aplicación de gestión de empleados. Basado en un anterior post donde creamos una aplicación básica de JDeveloper.

Sobre el proyecto en el menú contextual, New > EJB > Entities From Tables. Vamos a utilizar la tecnología EJB 3.0, anotando los beans de entidad como JPA 2.0:

Creating persistence model

Seleccionamos las tablas Departaments y Employees.

Como vimos en un artículo anterior, se puede obtener el diagrama de una base de datos ya hecha. Yo me lo he creado en el paquete lebrijo.diagrams:

Entity-RelationShip diagram

Podemos crear un New > EJB Diagram, y arrastrando las entidades anteriormente creada, tendremos el dibujo entero:

EJB diagram

En los dos beans refactorizaré el atributo employees por manager, ya que define más claramente la relación.

Refactoring manage relation

Esto se actualiza automáticamente en el diagrama de EJB (en teoria, en realidad hay que volver a arrastrar las entidades).

Como último ejercicio, podemos crear la consulta de encontrar por nombre, ampliando la anotación de consultas de la entidad Employees:

@Entity
@NamedQueries({
@NamedQuery(name = "Employees.findAll", query = "select o from Employees o")
,
@NamedQuery(name = "Employees.findByName", query = "select o from Employees o where o.firstName like :p_name")
})

Arquitectura JDeveloper con Weblogic

Parece una obviedad que la mejor herramienta para desarrollar sobre Weblogic/OracleDB es JDeveloper. Pero para mi, hasta ahora, no era tan obvio, ya que Eclipse es mi IDE preferido, ya que es el estándar para el desarrollo JAVA (Jboss, Spring, Android,…).

Si tu arquitectura es Oracle/Weblogic, no tienes miedo al cambio y tu obsesión es incrementar tu productividad, tu herramienta es JDeveloper. Voy a hacer una serie de artículos tratando de demostrar este punto. Pero si quieres ir abriendo boca te recomiendo que veas este video, veras como puede ser realmente sencillo hacer aplicaciones RIA en entornos empresariales muy complejos.

Read the rest of this entry »

Puesta a punto de Google App Engine

Voy a ver como instalar el plugin de GAE en mi Eclipse, y a hacer y subir mi primera aplicación sencilla para ver como gestiona el ciclo de vida básico de las aplicaciones dicho plugin.

Nos basaremos en el paquete Eclipse Galileo R2 para JEE projects de 64 bits. Y en el Google Plugin for Eclipse, que soporta las tecnologías GWT y GAE, en su versión para Galileo.

Instalar Eclipse es inmediato, se descarga y se descomprime en la carpeta que gustemos. Luego lo ejecutamos.

Para instalar el plugin de Google, Help > Install New Software … > Add, añadimos la url  Google Plugin for Eclipse for Galileo. E instalamos el plugin y las dos SDK.

Creamos la aplicación Web File > New > Web Application Project:

Creating project

Para probarla en modo local, en el menú conextual Debug As > Web Application. Así vemos como se debuguea la aplicación con el debuger de Eclipse de forma normal.

Para desplegarla en el servidor tenemos que tener cuenta en https://appengine.google.com,  y crear un ID (pe: firstapp-lebrijo). Este lo introduciremos a través del menú contextual Google > App Engine Settings… De esta forma Eclipse sabrá donde desplegarla cuando hagamos Google > Deploy to App Engine.

Tengo mi primera aplicación en: http://firstapp-lebrijo.appspot.com/

My First GAE App

Arquitectura: capa de servicios con Spring

Para implementar la capa de servicios y aprovechar su inyección de dependencias vamos a utilizar Spring.

Con Spring 2.5.6, que es la versión soportada por OEPE, para acomodar nuestro desarrollo.

Primero añadimos la Facet de Spring a nuestro proyecto. En el menu contextual del proyecto > Properties… :

Add Spring Facet

Luego generamos las clases ORM. Se generan con el menú contextual del proyecto > Spring > Generate Spring ORM Classes …

Creating new ORM Services

Como se observa, sobre las entidades JPA definidas en nuestro paquete de persistencia, se definen las clases de acceso y las de servicio. Os recomiendo echarle un buen vistazo a los paquetes lebrijo.school.services y lebrijo.school.dao.

Lo normal es que debamos limpiar estas clases de métodos, ya que genera todas las posibilidades (remove, persist, findById,…). Por ejemplo, si una entidad de nuestro modelo es una vista, no tendrá sentido mantener un DAO con los métodos persist y remove.

Aquí os dejo el zip del proyecto eclipse tras estas modificaciones.

JPA: Implementando la persistencia con EclipseLink

Veamos como implementar la persistencia en un proyecto de Eclipse con el estándar JPA implementado por EclipseLink.

Nos basaremos en el proyecto de Eclipse creado en el artículo anterior.  En las propiedades (botón derecho) del proyecto añadimos el “poder” de manejar Entidades JPA, añadiendo el Facet:

Adding JPA facet

Utilizaremos EclipseLink 1.1.2 ya que es la implementación de JPA por defecto en WebLogic 11g.

Generar Entidades desde las tablas

Sobre el proyecto en el menu contextual (botón derecho), JPA > Generate Entities from Tables… Elegimos la conexión SCHOOL creada anteriormente, y las tablas REGISTRY y SCHOOLCERTIFICATES. Generando las entidades en el paquete lebrijo.school.model:

Generating entities from tables

Para mantener la coherencia de JPA debemos añadir un Identificador a todas las clases, Registry lo tiene, pero a SchoolCertificates hay que añadírselo:

Add Identifier

Es muy interesante observar el fichero src/META-INF/persistence.xml, como se configura la conexión y se mapean las entidades.

<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="school" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
 	<class>lebrijo.school.model.Registry</class>
 
 	<class>lebrijo.school.model.Schoolcertificate</class>
		<properties>
			<property name="eclipselink.target-server" value="WebLogic_10"/>
			<property name="eclipselink.jdbc.driver" value="oracle.jdbc.OracleDriver"/>
			<property name="eclipselink.jdbc.url" value="jdbc:oracle:thin:@192.168.0.7:1521:xe"/>
			<property name="eclipselink.jdbc.user" value="school"/>
			<property name="eclipselink.jdbc.password" value="school"/>
			<property name="eclipselink.logging.level" value="FINEST"/>
		</properties>
 </persistence-unit>
</persistence>

Aquí os dejo el zip del proyecto eclipse tras estas modificaciones.

Plantillas básicas con JSP

Existe una forma de crear plantillas muy básica con JSP a base de includes, que nos puede servir para salir del paso, para un proyecto muy pequeño, por que no queramos utilizar tecnologías más pesadas, o queramos desplegar nuestro proyecto en cualquier servidor de aplicaciones.

La técnica trata de crear pequeños trozos de código en JSP (jsf, tags,…) para cabecera y pie. Y luego crear todas las páginas del proyectos a partir de una plantila.

Read the rest of this entry »

Maven: Herramienta de Gestión de Proyectos (en Eclipse)

Siguiendo con nuestro objetivo de crear un entorno de desarrollo de software Extremo, hoy añadimos esta herramienta a la caja.

Maven es una herramienta de gestión de proyectos de software con las siguientes características: Read the rest of this entry »

Generando código a partir de UML con Eclipse

Eclipse tiene un proyecto llamado EMF (Eclipse Modeling Framework) muy majo para dibujar diagramas UML2. Pero mi objetivo en este artículo es dibujar un diagramas de clases UML2 y generar el esqueleto de clases correspondiente.

En la arquitectura de la aplicación se recomienda tener tus modelos de dominio separados de servicio, lógica de negocio etc. EMF te permite crear tu diagrama de clases y luego generarte el código correspondiente.

Read the rest of this entry »

Eclipse para Oracle

OEPE (Oracle Enterprise Pack for Eclipse), es una distribución de Eclipse afinada por Oracle para conectarse a sus bases de datos y desarrollar con sus tecnologías.

  • Trae ya configurado el plugin para que la perspectiva de Administración de la BBDD sea capaz de ver todos los tipos de objetos (paqetes, vistas, sinónimos,…).
  • Predescargado Weblogic, para instalarlo de un clic. Y con facilidades para desarrollar planes de despliegue sobre el.
  • Sus librerías de JSF, y los conectores SCA con Spring.

Si desarrollas Java sobre Eclipse, con los productos de Oracle detrás (SGBD y WebLogic), está bien por lo menos conocer que existe esta distro de Eclipse.

Instalando Tomcat en nuestra Debian

Tomcat es un servidor Java de módulos web, es decir, implementa la capacidad de desplegar y servir módulos web basados en las tecnologías JSP y Servlets.

Vamos a instalarlo en nuestro Debian Etch.

Read the rest of this entry »