基于XDoclet的无状态会话Bean兼容性问题:WebSphere 9.0.5中的ClassCastException

问题描述 投票:0回答:1

我有一个遗留的 EJB 应用程序,最初是用 Java 1.6 开发的,十多年前部署在 WebSphere 8.5 上。 最近,我将Java版本升级到1.8,WebSphere版本升级到9.0.5。该应用程序运行良好。

但是,我遇到了一个与特定的基于 XDoclet 的无状态会话 bean 相关的特殊问题。该 bean 带有

@ejb.util generate = "physical".

注释

当批处理作业首先启动并创建 bean,然后应用程序尝试使用该 bean 时,会出现此问题。我收到以下异常:

Caused by: java.lang.ClassCastException: org.omg.stub.javax.ejb._EJBHome_Stub incompatible with com.xxx.common.reference.interfaces.ReferenceDataBeanHome

如果应用程序首先创建 bean,然后批处理作业使用它,则一切都会按预期进行。

我尝试过的:

我已经根据

IBM WebSphere 建议
更改了 @ejb.util generate = "logical".,但是如果在应用程序创建 Bean 之后启动,批处理作业就会开始失败

环境:

  • Java版本:1.8
  • WebSphere 版本:9.0.5

具体:

  • 该问题与 XDoclet 中
    @ejb.util generate = "physical"
    的使用有关。
  • 批处理作业在应用程序之前初始化bean时会发生异常。

问题:

  • 当批处理作业首先启动时,什么可能导致此 ClassCastException?
  • 如何确保两种情况下的兼容性:应用程序首先初始化 bean 时和批处理作业初始化时? 任何见解、建议或解决方案将不胜感激。谢谢!
java websphere ejb xdoclet
1个回答
0
投票

因 ClassCastException 失败的代码缺少对

PortableRemoteObject.narrow()
的调用。每当在命名中查找远程 EJB 时,它都应该执行
PortableRemoteObject.narrow

通常,代码在没有缩小范围的情况下也能工作,因为 ORB 会尝试自动缩小范围,但这并不总是有效,具体取决于查找时客户端的类路径。如果第一次查找在类路径上没有存根,那么您将获得 EJBHome 存根。不幸的是,这最终可能会缓存在命名中,这也可能会影响其他客户端。始终执行狭窄操作可以避免此问题。

© www.soinside.com 2019 - 2024. All rights reserved.