Seam en aplicaciones Standalone

20 feb 2008

Jboss Seam es un magnífico framework para el desarrollo de aplicaciones Web, pero plantea algunos problemas, cuando deseamos reutilizar nuestro código Seam  desde una aplicación que no se esta ejecutando dentro de un servidor de aplicaciones o desde un Thread independiente. Esto es debido a que sin la envoltura del servidor de aplicaciones, ninguno de los contextos Seam estarán disponibles.

El error típico con el que nos vamos a encontrar es:


java.lang.IllegalStateException: No application context active
at org.jboss.seam.Component.forName(Component.java:1807)

Código para inicializar Seam antes de utilizarlo:


     /**
     * Inicializa el contexto Seam.
     * Necesario para ejecutar código cuando el contexto Seam no esta inicializado y necesitamos acceder a elementos del contexto.
     * Con esto evitamos la excepción "No application context active"
     * @author Félix García Borrego
     */
    public static void initContextApplication(){
        if(!Contexts.isApplicationContextActive()){
        // Si el contexto no esta inicializado lo creamos
       if(!Lifecycle.isApplicationInitialized()){
            // La aplicación no esta activa, la activamos
            MockServletContext servletcontextMock = new MockServletContext();
            ServletLifecycle.beginApplication(servletcontextMock);
            new Initialization(servletcontextMock).create().init();
     }
     // Inicializamos el contexto
     ServletLifecycle.beginInitialization();
 }
Comparte esta entrada:
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • LinkedIn
  • Meneame
  • RSS
  • Twitter

7 Respuestas Para “Seam en aplicaciones Standalone”

  1. Julio Perera 20 de febrero de 2008 at 22:24 hrs. #

    Gracias!!

    Probado desde Coldfusion 8 como war en una aplicacion en donde los componentes seam estan en un jar (modulo EJB) y funciona bien

  2. xourge 02 de mayo de 2008 at 08:29 hrs. #

    Bien eso soluciona lo del application context… pero como se soluciona luego lo del:

    java.lang.IllegalStateException: No session context active

    me ocurre cuando trato de efectuar un request.getContextPath();

  3. Félix García Borrego 02 de mayo de 2008 at 09:44 hrs. #

    Cierto, esta solución es útil si tienes todos tus beans en contexto de Aplicación, si quieres acceder a sesión es un poco mas complejo, quizás esto código te pueda servir de orientación:
    /**
    * Si la request del usuario no esta asociada a Seam la inicializa
    * Para que estén disponibles todos los elementos seam.
    * Nota: Si el Application Context no esta inicializado, también lo crea.
    * @param request
    */
    public static void beginRequest(HttpServletRequest request){
    ServletLifecycle.beginRequest(request);
    ServletContexts.instance().setRequest(request);
    ConversationPropagation.instance().restoreConversationId( request.getParameterMap() );
    Manager.instance().restoreConversation();
    ServletLifecycle.resumeConversation(request);
    Manager.instance().handleConversationPropagation( request.getParameterMap() );
    }

  4. Gustavo Schmidt 23 de marzo de 2010 at 13:50 hrs. #

    Estoy buscando la forma de acceder al EntityManager desde una aplicación Standalone, y vi que sugeriste el código para acceder al contexto de una sesión, pero esta incompleto, ¿ Podrías darme un ejemplo completo?

    Gracias.

  5. Gustavo Schmidt 26 de marzo de 2010 at 14:41 hrs. #

    Necesito integrar una aplicacion standalone a otra hecha con Seam. Veo que hay una orientacion para acceder a un contexto de sesion pero necesito saber si se puede utilizar el EntityManager de seam desde la aplicacion standalone.

  6. Félix García Borrego 29 de marzo de 2010 at 15:50 hrs. #

    Hola Gustavo,
    Aunque hay que montar algunos “artificios” es perfectamente posible usar/integrar una aplicación Seam dentro de una aplicación standalone.

    Te pongo un caso típico.
    -El main inicializa el contexto Seam (esto hace que todos los componentes declarados con anotaciones o en el components.xml estén disponibles).
    -En la clase en la que quieras utilizar en el EntityManager colocas el @In
    -Creas una instancia de la clase mediante Seam (por ejemplo Component.getInstance(clase) en lugar de con “new”.

  7. Gustavo Schmidt 30 de marzo de 2010 at 17:01 hrs. #

    Felix, gracias por la respuesta. Lo que te pido es si me podías pasar como montar los “artificios” y como el main inicializa el contexto Seam. Tengo que resolver este problema y no encuentro mucha información.

    Gracias nuevamente.
    Saludos.

Deje una respuesta