5

我有一个部署在两个 EAR 中的 java Web 应用程序——一个用于 UI 层(包含一个 WAR 模块),一个用于业务层(包含一个 EJB 模块)。两个层都部署到 WebSphere Application Server 7。这些层通过 EJB 3.0 无状态会话 bean 连接。通过 JNDI 查找 bean。

我们使用 Hibernate 来实现持久性,并使用 DB2 数据库。

返回远程 EJB 调用时,客户端出现以下错误:

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

对象上的字段java.util.Date作为com.ibm.db2.jcc.DBTimestamp字段从 Hibernate 返回,它 extends java.sql.Timestampwhich extends java.util.Date。因为它是一个子类java.util.Date并且是可序列化的,所以不应该处理吗?

我与一位更有经验的人交谈过,他说可能的原因是DBTimestampWeb 和业务层 WAS 服务器之间的 JVM 版本或类版本不同。两台服务器都具有相同的 JVM、WAS 和 JAR 版本。

我还有一个本地 WAS 7 服务器,其中两个层都部署到同一台服务器上。EJB 仍然通过对 localhost 的 JNDI 调用远程解析。该应用程序在我的本地服务器上运行良好。我知道的唯一区别是不同的微版本 WAS,以及将两个层部署到同一台服务器。

问题的原因是什么?是DBTimestamp在网络层找不到该类,还是该类的版本不同?或者它是多态性的问题,还是完全其他的问题?

除了答案之外,我也很感激有关尝试什么调试的任何建议-我没有想法。

4

1 回答 1

2

通过将相关的 DB2 驱动程序 JAR 打包到 Web 层 EAR 中,我设法“解决”了这个问题。

因此,问题的原因是该类在 Web 层的类路径上不可用。我需要调查环境的设置以找出它不可用的原因,但至少现在问题很清楚了。

于 2012-07-19T22:50:08.243 回答