Mostrando entradas con la etiqueta spring. Mostrar todas las entradas
Mostrando entradas con la etiqueta spring. Mostrar todas las entradas

Glassfish 3.0: Cliente Remoto EJB 3.0

Hace poco me he visto en la necesidad de crear un cliente sobre unos session beans de EJB 3.0 en un servidor Glassfish 3.0 remoto para un proyecto que estoy realizando sobre Eclipse RAP.

Esta vez realizare un pequeño ejemplo sobre como llevar a cabo la tarea apoyandome, como siempre, de Spring 3.0 he invocare un servicio a través de JNDI.

Primeramente creare un módulo EJB el cual creare una interfaz remota (es necesario que sea remota si se va a acceder al servicio fuera del contenedor). Si bien en J2EE 6 ya no es necesario utilizar interfaces a mi me gusta mas de esa manera para que no quede al descubierto la implementación de la solución y que a su vez al modulo que invocara el servicio, una interfaz le resulta mas simple usar.



Luego realizo la implementación en el módulo EJB.



Realizo el deploy en mi glassfish y procedo a realizar un cliente standalone.

Para realizar el cliente es necesario importar el jar gf-client.jar que se encuentra en la carpeta lib de la instalación de glassfish 3.0.

Ahora procedo a crear mi solución.



Creo los archivos de configuración de spring.



applicationContext.xml


Por último creo mi clase main.



Adjunto codigo fuente para efectos de estudio.

Comentarios (2)

JSF 2.0: Error Handling

Ya había realizado un post sobre como manejar las excepciones en JSF apoyandome en richfaces, pero lo hicen pensando que aún seguia utilizando JSF 1.2, esta vez lo haré casi de forma similar pero esta vez para la versión 2.0 de JSF y apoyandome con primefaces y usando un poco de spring para poder enviar los errores al contexto de la aplicación.

Este post será muy similar a como se manejan los errores como en swing, que será implementando dos clases que capturan las excepciones en tiempo de ejecucion.

Luego el factory

Ahora hay que registrar el exception factory en el faces-config.xml

Mi bean que implementa la funcionalidad para enviar los mensajes al contexto de la aplicacion sera asi:

No explicare como configurar el bean anterior con spring ya que para ello ya he abordado el tema bastante.
Mi managed bean quedara de la siguiente manera

La plantilla la defino de la siguiente manera
Y la pagina implementando la plantilla

El resultado seria así



Adjunto codigo fuente para efectos de estudio.

Comentarios (0)

Inyectar objetos JSF 2.0 en Custom Converters

Ya en una entrada previa había explicado que son los convertidores en JSF y como implementarlos, esta vez lo haré con JSF 2.0 e inyectare el acceso a datos a través de Spring.

La clave de esto es utilizar el FacesContextUtils.

De esta forma ya no es necesario registrar el converter en el archivo faces-config.xml y puede utilizarse para cualquier tipo de componente.

Comentarios (0)

Integracion de Liquibase con Spring y JPA

¿Qué es Liquibase?

Liquibase, es una libreria opensource para gestionar los cambios en base de datos. En la etapa de desarrollo de un sistema casi como norma debe versionarse el código fuente, pero no había un mecanismo para llevar un control de los cambios en la estructura de la base de datos y de esta necesidad nace liquibase.

En un equipo de desarrollo es habitual que cada miembro realice procedimientos almacenados, vistas o cambios en las estructuras de las tablas en función de las funciones que este desarrollando y al momento de integrar todo se vuelve un quilombo. Con liquibase los cambios se realizan a través de un archivo de cambios el cual se sincroniza con los demás miembros del equipo, de esta forma los cambios no se hacen directamente a la base de datos sino desde la aplicación al momento de su ejecución.

Desarrollare un pequeño ejemplo de como implementar esta libreria con Spring y JPA, del lado de la base de datos utilizare PostgreSQL. Supondremos que ya tenemos creado nuestro acceso a datos y procedemos a configurar el contexto de spring.


Ahora se debe configurar el archivo donde se declaran los cambios en la base de datos.

Cuando ejecutemos la aplicación liquibase intentara primeramente hacer efectivos los cambios configurados en db-changelog.xml

En el caso de JPA, es de tener en cuenta que siempre hay que actualizar manualmente los Entity class, ya que no es parte de las funciones de liquibase.

Adjunto código fuente para efectos de estudio.

Comentarios (1)opiniones, ¿cual es la tuya?

Lazy Loading en ice:dataTable con ICEfaces

¿Que és lazy loading? pues traduciendolo a mi manera en español podria referirse a carga ociosa, es decir carga ociosa de datos. ¿para que se utiliza? sucede que cuando se utiliza un dataTable con JSF siempre se le envia la lista completa de registros que se obtienen de una busqueda en la base de datos y los carga todos de una vez en la tabla para usarlos con un paginador, ¿pero que sucede si tenemos una busqueda de miles de registros? no podemos carga toda esa lista en el dataTable, entonces surge la necesidad de solo traer que necesitamos ver en el paginador por bloques.

Algunos diran que ya existe un articulo en la documentación oficial de ICEfaces para realizar un lazy loading, pero el punto es que es muy dificil de entender ya que agregan otras funcionalidades que estan demas y mi objetivo es simplificar el entendimiento de la técnica.

En esta ocasión utilizare netbeans, tomcat y spring para el acceso a datos.

Utilizare tambien la tabla "Manufacturer" de la base de datos derby "Sample" embebida en netbeans, ya que es la unica que tiene algunos cuantos registros para efectos de prueba.

No entrare en detalle de como configurar un proyecto JSF con ICEfaces ni de como integrarlo con Spring para el acceso a datos, supondre que se ha leido las entradas respectivas.

Suponiendo que ya se ha generado el entity de la tabla Manufacturer creo mi acceso a datos.



Luego la implementación



Luego creo mi configuracion en spring



Ahora la parte fundamental es crear un custom DataModel



Ahora me dedico a crear los managed beans.





Por ultimo el diseño de la página xhtml



El resultado sera el siguiente

A través del trace se puede observar que por cada vez que se cambia de pagina se obtiene el bloque de registros que interesa.

Adjunto el codigo fuente para efectos de estudio.

Comentarios (2)

Spring 3.0 y JSF 2.0

Hace poco me había planteado la necesidad de utilizar una capa de servicios potente como EJB 3.0 pero sin utilizar un servidor de aplicaciones sino un simple tomcat, ya que este no es un contenedor de EJB. Así que me decidi por la combinación Spring 3.0 y JSF 2.0, la reseta de implementación JPA 2.0 para Spring utilizare Hibernate. Aca desarrollare un ejemplo de como utilizar las dos tecnologías antes mencionadas. Antes que nada es necesario configurar un datasource el cual accederemos desde spring vía jndi, para el ejemplo accederemos a la base de datos derby que esta embebida con netbeans. En el archivo contex.xml del tomcat creamos el datasource.
 
Ahora procedemos con la capa de acceso a datos generando los entities de las tablas "customer" y "discount_code". Modificamos el archivo persistence.xml que debera quedar de la siguiente manera:
Creare la interfaz con la con la cual las transacciones de spring funcionaran
 
Luego creo la implementación
 
 El siguiente paso es configurar el archivo de spring applicationContex.xml en la ubicación WEB-INF
Ahora vamos con la parte de la vista. Se debe configurar el proyecto web para que JSF pueda interactuar con Spring. Se agregan las siguientes líneas en el archivo web.xml:
 
 Luego se debe configurar el archivo faces-config.xml para que spring pueda realizar inyección de dependencias a través de el lenguaje de extextareasiones de JSF, se debe crear sino existe.
Luego creo el managed bean
 
Por ultimo desplegamos la java.util.Lista "customers" del managed bean en nuestra página xhtml
El resultado sera el siguiente
Adjunto el código fuente para efectos de estudio.

Comentarios (1)opiniones, ¿cual es la tuya?

Spring 3.0 e Hibernate JPA 2.0

Hace unos días me decici a integrar Spring con la implementacion JPA 2.0 de Hibernate. En esta ocasión la versión de spring que usare es la 3.0 de Hibernate 3.6.7 y la base de datos de ejemplo (derby - sample) que se encuentra embebida en Netbeans.

Los jars necesarios para utilizar la implementación JPA de Hibernate, en donde {hibernate-path} es la ruta donde esta descomprimido la distribución final de Hibernate 3.6.7:

{hibernate-path}\lib\jpa\hibernate-jpa-2.0-api-1.0.1.Final.jar
{hibernate-path}\lib\required\antlr-2.7.6.jar
{hibernate-path}\lib\required\commons-collections-3.1.jar
{hibernate-path}\lib\required\dom4j-1.6.1.jar
{hibernate-path}\lib\required\javassist-3.12.0.GA.jar
{hibernate-path}\lib\required\jta-1.1.jar
{hibernate-path}\lib\required\slf4j-api-1.6.1.jar
{hibernate-path}\hibernate3.jar

Como nota aclaratoria es tambien necesario agregar el jar aopalliance.jar para poder utilizar la anotación @Transactional, en este ejemplo no realizaremos un CRUD por esa razón no se incluye.


Y la versión 3.0 de Spring que viene con Netbeans.

Las tablas que utilizare son "Product", "Manufacturer" y "Product_Code", al mapear las tablas con el asistente de Netbeans obtengo sus clases

La unidad de persistencia debera quedar de la siguiente forma:




  
    org.hibernate.ejb.HibernatePersistence
    org.dani.ejemplo.jpa.dao.ProductCode
    org.dani.ejemplo.jpa.dao.Product
    org.dani.ejemplo.jpa.dao.Manufacturer
    
  


Creo el acceso a datos para las tablas.

package org.dani.ejemplo.jpa.dao;
import org.springframework.orm.jpa.support.JpaDaoSupport;
import java.util.*;
/**
 *
 * @author dherrera
 */
public class DerbySampleDAO extends JpaDaoSupport{

    public List getAllProducts() {
        return getJpaTemplate().find("Select p From Product p");
    }
}


Luego procedo a configurar el archivo de configuración de spring



    


    
     
    
        
            
            
        
    
    
        
    


    
    
    
    


    
    

    




Y la forma de uso sera de la siguiente forma:

package org.dani.ejemplo.jpa;

import java.util.List;
import org.dani.ejemplo.jpa.dao.DerbySampleDAO;
import org.dani.ejemplo.jpa.dao.Product;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 *
 * @author dherrera
 */
public class Init {

    public static void main(String[] args) {
        ApplicationContext ctx=new ClassPathXmlApplicationContext("/org/dani/ejemplo/jpa/applicationContext.xml");
        DerbySampleDAO dao=(DerbySampleDAO) ctx.getBean("dao");
        List list=dao.getAllProducts();
        for(Product product:list)
            System.out.println(product.getDescription());
    }
}

Adjunto el código fuente de ejemplo aca.

Comentarios (0)