jueves, 17 de enero de 2013

WebCenter Portal BUG: java.io.NotSerializableException: oracle.webcenter.admin.view.backing.ProducerConnection

Es muy usual encontrar el siguiente error en una aplicación WebCenter Portal en su versión 11.1.1.6

ADFc: Scope object serialization failed (object not serializable), scope='pageFlowScope[/oracle/webcenter/admin/view/jsf/taskFlowDefs/producer.xml#producer]', objectKey='ProducerConnection', objectType='oracle.webcenter.admin.view.backing.ProducerConnection'.
[2013-01-17T12:18:52.829+00:00] [WC_CustomPortal1] [ERROR] [] [oracle.adfinternal.controller.state.SessionBasedScopeMap] [tid:
[ACTIVE].ExecuteThread: '0' for queue: 'weblogic.kernel.Default
(self-tuning)'] [ecid: 0000Jl8ScwT3n3b5xJ^
AyW1GxgoE0000T5,0] [APP:MyPortal#V2.0] [[ java.io.NotSerializableException:
oracle.webcenter.admin.view.
backing.ProducerConnection
        at java.io.ObjectOutputStream.
writeObject0(ObjectOutputStream.java:1164)
        at java.io.ObjectOutputStream.
writeObject(ObjectOutputStream.java:330)
        at oracle.adfinternal.controller.
util.Utils.verifySerializable(Utils.java:342)
        at oracle.adfinternal.controller.
state.SessionBasedScopeMap.writeScopeMap(SessionBasedScopeMap.java:122)
        at oracle.adfinternal.controller.
state.PageFlowScope.writeObject(PageFlowScope.java:157)
        ....

Recordar que todo Manage Bean con una scope superior a una request debe obligatoriamente ser serializable, es decir, implementar el interfaz java.io.Serializable y que todos sus atributos sean serializables.

(En una próxima entrada, explicaré el porque los Manage Bean con un una scope superior a una request (es decir: viewScope, pageFlowScope, sessionScope o applicationScope) deben implementar Serializable, así como las configuraciones que deben realizarse en una aplicación ADF cara a un despliegue en entorno en clúster).

Volviendo al error comentado previamente... Este error aparece cuando un Administrador accede a la página de administración de una aplicación WebCenter Portal. En la pestaña "Services", donde se configuran las conexiones a los productores de portlets, el bean ejecutado por el producto es el causante de dicho error.

Una solución temporal hasta un parche oficial es la siguiente.
  •  Crear la clase con el mismo nombre y paquete en la aplicación de WebCenter Portal.
    oracle.webcenter.admin.view.backing.ProducerConnection

    Package explorer

    Nota: Para WebCenter Portal : Spaces valdría con desplegar en una shared-lib la clase que se va a crear.
  • Localizar la clase en la librería de WebCenter: producer-registration-view.jar
    Librería abierta con WinRAR

  • Decompila, copia el código fuente y haz que esta clase implemente Serializable.

    ProducerConnection implementando Serializable
  • Agrega la libreria producer-registration-view.jar al proyecto para solventar los errores de compilación. La librería se encuentra en la Middelware Home:

    C:\Oracle\Middleware\jdeveloper\webcenter\modules\oracle.webcenter.framework_11.1.1
  • Finalmente cambiar el cargador de clases configurado en la aplicación para dar preferencia sobre la clase recien creada. Para ello modificar los siguientes archivos:
    • weblogic.xml: Añadir la propiedad prefer-web-inf-classes para que las clases sean cargadas primero desde el nivel de aplicación.
      <container-descriptor>
          <prefer-web-inf-classes>true</prefer-web-inf-classes>
       </container-descriptor>
    • weblogic-application.xml: Restringir que las clases a cargar desde a nivel de aplicación sean del paquete  oracle.webcenter.admin.view.backing.*<prefer-application-packages>
          <package-name>oracle.webcenter.admin.view.backing.*</package-name>
      </prefer-application-packages>
Con esto se ha conseguido que el cargador de clases de WebLogic lea previamente nuestra clase en lugar de la del producto. Al haber convertido a Serializable el error desaparecerá de las trazas del servidor.
Consecuencias
Si algún parche de WebCenter o versión modifica esta clase. Se debe copiar el nuevo source asociado en el caso de que aún no esté corregido el bug.
Se debe tener muy en cuentra este tipo de "parches" no son oficiales de Oracle y pueden causar problemas al aplicar futuros parches del producto.