01 May 2012

ADF Faces con Spring 3.1

Desde hace ya mucho tiempo la utilización de Spring esta muy extendida en el mundo del Open Source, y existen muchos frameworks que se integran fácilmente, poniendo al alcance unos de otros toda su funcionalidad; así que por que no aprovechar todo este ecosistema desde ADF? A continuación veremos como configurar Spring 3.1 en una aplicación ADF 11g.

Realmente la integración no tiene ningún secreto, solo hay que seguir los pasos que marca el manual de Spring:
  1. Añadir las librerías de Spring al proyecto ViewController
  2. Crear el fichero de configuración de Spring(E.j.: /WEB-INF/applicationContext31.xml)
  3. Registrar los recursos necesarios en el fichero /WEB-INF/web.xml
  4. Hacer disponibles los beans de Spring desde Expression Language
Lo primero es crear una librería con los jar de Spring que necesitemos utilizar y añadirla a nuestro proyecto.
Lo segundo es crear nuestro fichero de configuración de Spring con el registro de nuestros beans.
Lo tercero, registrar el parámetro de contexto y el listener de Spring en el fichero /WEB-INF/web.xml.
Cuarto, para poner al alcance de Expression Languge la utilización de los beans de Spring, hay que registrar la clase SpringBeanFacesELResolver dentro del fichero faces-config.xml.
A partir de este momento utilizando Expression Language podremos acceder a todos los beans y sus propiedades de Spring, una expresión válida, por ejemplo sería: #{mybean31.mensaje}.

Finalmente hay que indicar en el fichero de configuración de weblogic que de preferencias a nuestras clases de spring:


Durante el despliegue de la aplicación surgio un problema con la definición de los ficheros de Spring.
XML-24509: (Error) Definición duplicada para: 'annotation'
XML-24509: (Error) Definición duplicada para: 'typedParameterType'
XML-24509: (Error) Definición duplicada para: 'exportsType'
XML-24509: (Error) Definición duplicada para: 'registersScopeType'
Solución:
Indicar como paramétro de la MV que Spring 3.1 utilice el parser de xerces. Es recomendable reiniciar el servidor despúes de esto.

-Djavax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl


Y apartir de este momento empiezan otros quebraderos de cabeza :-)

Enlaces relacionados:
- FIN -

3 comments:

Juan C Ruiz said...

Hola Emerson,

Interesante el artículo. Según entiendo Spring reemplazaria la capa de ADF Model. Entonces en este caso también tendríamos que adicionar logica de negocio del lado de la vista en los managed beans para nosotros mismos crear el soporte que nos da el DataControl.

¿Cuál es tu opinion?

Juan Camilo

Emmerson Miranda said...

Hola Juan,

Hablando de quebraderos de cabeza :-) por que en si, esto da mucho juego. Teniendo presente que una solución puede ser adecuada para uno o muchos problemas, pero no para todos, cualquier cosa que diga puede ser matizada según un contexto de aplicación.

Algunas de las alternativas que se ocurren son por ejemplo:
- Desarrollar una aplicación al completo con la arquitectura de Spring utilizando la potencia de Faces.
- Exponer los servicios de Spring como Data Controls y consumirlos desde Faces.
-Un modelo mixto en el modelo entre ADF BC y Spring.

Como ya adelantaba en el post, la intención básica es poder aprovechar todo el ecosistema OpenSource que tiene Spring desde ADF.

Y aunque parezca que no venga a cuento; por otro lado hecho en falta actualmente la utilización de CDI en ADF, pero bueno ya se irá viendo.

Emmerson.

Marcelo A. Vasquez said...

Hola Juan, bien por este dato que seguro en algún momento servirá.

Recuerdo hace varios años .. como en el 2004 usamos Spring para definir en el contexto algunos bean que hacian a la implementación de un patron llamado Strategy, desde Business Component accediamos al Contexto de Spring y usabamos el Strategy, también para ese proyecto usamos Quartz en donde definimos algunos procesos que se disparaba a determinada con cierta frecuencia. La verdad no descarto el uso de Spring para determinadas cosas que pueden llegar a ser utiles y más si deseamos delegar ciertas responsabilidades a alguien.