miércoles, 22 de febrero de 2012

Evitando que las validaciones ADF afecten a nuestra navegación en WebCenter

En esta entrada os traigo una solución a un error muy común en la integración ADF Bounded Task Flows con aplicaciones de WebCenter Portal.

Enlace a descarga del ejemplo.

El contexto del problema es la siguiente:

  • Nuestro ADF Bounded Task Flow contiene validaciones a ejecutar sobre campos ADF.

    Validación del campo al pulsar el flujo normal del Task Flow
  • Al intentar navegar de una página (que contiene nuestro Task Flow) a otra nos encontramos que no nos deja puesto que se está ejecutando.

    Validación del campo producido al intentar navegar a otra página de WebCenter
¿Por qué no podemos navegar a otra página sin rellenar los campos requeridos?

Esto es debido a qué en el ciclo de vida de ADF se está ejecutando la fase de validaciones sobre los campos.

¿Cómo evitar este problema?

La solución es recubrir los campos a ser validados por un <af:subform> con ello conseguiremos que no participen en el ciclo global de la aplicación y sólo sean validados en el propio Task Flow.

<af:subform> en el fragmento del Task Flow

Otra solución sería cambiar la codificación de la plantilla de página para para poder utilizar el atributo immediate y así poder evitar la fase de validaciones de ADF al navegar (ampliaré la entrada con esta posible solución).

En el ejemplo adjunto a la entrada hay una Bounded Task Flow sencilla que ejecuta la validación numérica sobre el campo. Está el código de la solución comentado en el código para ver la diferencia al descomentarlo. Por ello al ejecutar por primera vez el ejemplo no podréis navegar a la página de Test.

En el ejemplo descargable viene comentado

Ejemplo desarrollado con:
  • JDeveloper 11.1.1.4 con la extensión de Oracle WebCenter PS3.
Referencias:

Un saludo a todos.

9 comentarios:

  1. hola, una pregunta, te ha ocurrido que personalizar el de PageTempleGlobe.jspx y a la hora de subirlo al webcenter spaces no funciona como debe ser, es decir al tratar de logearme se queda en la pantalla principal y tengo que dar nuevamente click en login para que me aparezca como si estuviera logeado, no le cambie nada al subirlo en el WebCenter Spaces Versión 11.1.1.5.0 (Versión Interna WORKPLACE_11.1.1.5.0_GENERIC_110415.0606, te agradeceria mucho la ayuda

    ResponderEliminar
    Respuestas
    1. Hola Sara.

      Para poder ayudarte necesito algún dato más.
      Tienes un WebCenter Spaces PS5 y le has subido como Page Template la PageTemplateGlobe como plantilla de página elegible, correcto ¿no?. Ahora llega mi duda, cuando dices "logarte" te refieres a realizar "login" en la aplicación de WebCenter Spaces al entrar (/webcenter) y al navegar a una página de un espacio con la Page Template apareces como "no logado" ó, en otro caso, estas intentando logarte desde el login que viene por defecto en la plantilla que genera una aplicación de WebCenter Portal.

      Otra duda es: ¿tienes WebCenter Spaces configurado con alguna solución de SSO como Oracle OAM?.

      De todos modos haré una prueba de concepto y te comento.

      Eliminar
    2. Es WebCenter Spaces PS4 y el PageTempleGlobe.jspx lo coloque como Page Template de mi Index. El problema es que después de realizar login, sigo estando en el Index y pareciera que aun no tengo una sesión, es decir me siguen apareciendo los InputText de Usuario y Password en vez de los datos del Usuario, estoy dejando tal cual esta el PageTempleGlobe.jspx :





























      //Nota: me aparecen los datos del usuario pero cuando doy un segundo clic o recargo la página.

      muchas gracias!!

      Eliminar
    3. mmm mi código no aparecio, mira te envio mi liga: http://184.154.15.2:8888/webcenter/spaces/prueba

      usuario: visor
      password: visor321

      Es para que puedas ver que es lo que hace el login.
      muchas gracias!!!!

      Eliminar
    4. Hasta el Lunes no dispondré de mi WebCenter Spaces para realizar pruebas. De todos modos, a primera vista lo que parece estar pasando es que los "success_url" y "fail_url" a la hora de realizar login no están funcionando de manera correcta.

      Al dar el segundo click, como encuentra que realmente ya estas "logado" únicamente esta refrescando la template haciendo desaparecer el login.

      Para evitar lo del 2º click lo que puedes es crear un Bean "LoginBean" que lo que haga es precargar los datos de login.

      /**
      * Code to execute befor Login action
      * @param actionEvent
      */
      public void processBeforeDoLogin(ActionEvent actionEvent) {
      JSFUtils.setManagedBeanValue("o_w_s_l_LoginBackingBean.userName", username);
      JSFUtils.setManagedBeanValue("o_w_s_l_LoginBackingBean.password", password);
      }
      }

      Este código está sacado de: http://andrejusb.blogspot.com/2011/05/oracle-webcenter-11g-ps3-adf-security.html

      Debes invocar el processBeforeDoLogin en el actionListener de tu acción de Login. (Evidentemente donde poner userName y password poner los valores recogidos de los campos del formulario).

      Yo creo que con esto al menos evitarás el "doble-click".

      De todos modos le echaré un ojo con mis Spaces que hace tiempo que no toco Spaces ;).

      Un saludo!.

      Eliminar
    5. Decompilando "spaces-web.jar" encontrarás tanto la página de Login.jspx de WebCenter Spaces como el Task Flow que utiliza para realizar "login".

      Podrás observar que utiliza un bean distinto a una Custom Portal.

      Si te puede inspirar, aqui tienes el código invocado por login / logout en PS1 y PS2: http://www.oracle.com/technetwork/middleware/webcenter/owcs-ps1-site-template-wp-134090.pdf

      De todos modos el Lunes te comento :). Buen fin de semana!.

      Eliminar
  2. Utiliza el Task Flow de Login que viene con Spaces, customizalo o hazte tu propio Login. No te valdrá o_w_s_l_LoginBackingBean tal y como viene por defecto.

    ResponderEliminar
  3. Muchas gracias!! me parece que hacer el login si es la mejor opción...saludos!!!1

    ResponderEliminar
  4. Hola.

    ¿Hay manera de personalizar el mensaje de error que retorna o_w_s_l_LoginBackingBean.doLogin?

    ResponderEliminar