tutorial transacciones libreria introduccion español con aprender aplicaciones java serialization db2 websphere ejb-3.0

java - transacciones - libreria ejb



UID de serialización no coincidentes en el método remoto EJB-java.util.date y DBTimestamp (1)

Tengo una aplicación web java que se implementa en dos EAR: uno para el nivel UI (contiene un módulo WAR) y otro para el nivel empresarial (contiene un módulo EJB). Ambos niveles se implementan en WebSphere Application Server 7. Los niveles se conectan a través de beans de sesión sin estado EJB 3.0. Los frijoles se buscan a través de JNDI.

Usamos Hibernate para la persistencia y una base de datos DB2.

Cuando se devuelve la llamada EJB remota, se produce el siguiente error en el lado del cliente:

java.rmi.MarshalException: CORBA MARSHAL 0x4942f896 No; nested exception is: org.omg.CORBA.MARSHAL: Unable to read value from underlying bridge : Mismatched serialization UIDs : Source (RepId RMI:java.util.Date:AC117E28FE36587A:686A81014B597419) = 686A81014B597419 whereas Target (RepId RMI:com.ibm.db2.jcc.DBTimestamp:AA774DBE96ECCE99:7AFCE1FB570D419C) = 7AFCE1FB570D419C vmcid: IBM minor code: 896 completed: No

El campo java.util.Date en el objeto se devuelve desde Hibernate como un campo com.ibm.db2.jcc.DBTimestamp , que amplía java.sql.Timestamp que extiende java.util.Date . Como es una subclase de java.util.Date y es serializable, ¿no debería manejarse?

He hablado con una persona con más experiencia que ha dicho que la causa probable es que la versión de JVM o la versión de clase DBTimestamp sea ​​diferente entre los servidores WAS de nivel web y empresarial. Ambos servidores tienen la misma versión de JVM, WAS y JAR.

También tengo un servidor local WAS 7, donde ambos niveles se implementan en el mismo servidor. Los EJB aún se resuelven de forma remota a través de una llamada JNDI a localhost. La aplicación funciona bien en mi servidor local. La única diferencia que conozco es una microversión diferente de WAS, además de implementar ambas capas en el mismo servidor.

¿Cuál es la causa del problema? ¿Es que la clase DBTimestamp no se puede encontrar en el nivel web, o que la versión de la clase es diferente? ¿O es un problema con el polimorfismo, o algo completamente diferente?

Además de una respuesta, también agradecería cualquier consejo sobre qué depuración probar: me he quedado sin ideas.


Logré ''arreglar'' el problema empaquetando el JAR del controlador DB2 correspondiente en el EAR del nivel web.

La causa del problema es, por lo tanto, que la clase no estaba disponible en el classpath del nivel web. Tendré que investigar la configuración del entorno para descubrir por qué no está disponible, pero al menos el problema está claro ahora.