无法从 Servlet、JSP 文件、独立程序或其他客户机访问企业 Bean

将这些故障诊断技巧用于与访问企业 Bean 有关的问题。

[AIX Solaris HP-UX Linux Windows][IBM i]如果客户机对于企业 Bean 是远程的,即在不同的应用程序服务器中或作为独立客户机运行,请浏览主管企业 Bean 的应用程序服务器的 JVM 日志以及客户机的日志文件。

[z/OS]如果客户机对于企业 Bean 是远程的,即在不同的应用程序服务器中或作为独立客户机运行,请浏览主管企业 Bean 的应用程序服务器的日志以及客户机的日志文件。

[AIX Solaris HP-UX Linux Windows][IBM i]如果没有看到与您的问题类似的问题,或所提供的信息未解决您的问题,请执行这些步骤:
  1. 如果问题看似与名称服务相关,即您看到 NameNotFoundException 错误或以 NMSV 开始的消息标识,请参阅这些主题以了解更多信息:
  2. 使用诊断和修正问题:学习资源中的链接检查是否已标识和记录了该问题。
如果仍然无法修正您的问题,请参阅来自 IBM 的故障诊断帮助以获取进一步的帮助。

java.lang.NoSuchMethodError

尝试对会话 Bean 调用方法时,发生 java.lang.NoSuchMethodError。

以下是此类错误的示例:
尝试对 Bean 调用方法 xSLTStory4Session 时,显示了 java.lang.NoSuchMethodError。

CNTR0020E: 对 Bean“BeanId(ERWW_v8#XSLTStory4SessionEJB3.jar#XSLTStory4SessionFacadeBean, null)”
调用方法“xSLTStory4Session”时,EJB 抛出了意外的(未声明的)异常。
异常数据:java.lang.NoSuchMethodError: paysession/ejb3/PaySessionFacadeRemote。
paySession(Ljava/lang/String;)Ljava/lang/String;

在本例中,EAR 文件内的多个模块中存在多个版本的 PaySessionFacadeRemote 接口。其中一个接口未包含期望的方法。

运行时已根据 EAR 文件的类路径中第一个版本的 PaySessionFacadeRemote 接口(这不是正确的版本)生成了存根类。

访问有状态会话 EJB 时,ObjectNotFoundException 或 ObjectNotFoundLocalException

此问题的可能的原因是有状态会话 bean 超时并且由容器移除了。必须按照 EJB 2.1 及更高版本规范,在代码中处理此事件。

在 JVM 日志文件中找到以“EJSContainer E Bean method threw exception [exception_name]”开头的堆栈跟踪

如果异常名称表明 IBM 类抛出了以“com.ibm...”开头的异常,请按描述的方式在信息中心和联机帮助中搜索该异常名称。如果“异常名称”指示由应用程序抛出的异常,请联系应用程序开发者以确定原因。

javax.naming.NameNotFoundException: 在“local”上下文中找不到名称 name

此异常的可能原因是,企业 Bean 对于客户机 JSP、Servlet、Java 应用程序或其他企业 Bean 而言并非本地企业 Bean(不在同一 Java 虚拟机 [JVM] 或应用程序服务器中运行),但是此调用针对企业 Bean 的“本地”接口方法进行。例如,如果此访问在开发环境中工作,但部署到 WebSphere Application Server 后却不工作,那么可能是因为,在开发时,企业 Bean 及其客户机在同一个 JVM 中,但部署后它们在不同的进程中。

要解决此问题,联系企业 Bean 的开发者并确定客户机调用是否是对于企业 Bean 的本地接口中的方法。 如果是,那么将客户机代码更改为调用远程接口方法,或将本地方法提升到远程接口。

对带有本地接口的企业 Bean 的引用在含 URL 方案 local: 的服务器进程的本地名称空间中绑定。[AIX Solaris HP-UX Linux Windows][IBM i]要获取服务器 local: 名称空间的转储,请使用“java:、local: 和 server 名称空间的名称空间转储实用程序”一文中描述的名称空间转储实用程序。

抛出 BeanNotReentrantException

发生此问题的原因是客户机代码(通常为 servlet 或 JSP 文件)尝试从两个不同的客户机线程调用同一有状态 SessionBean。当应用程序将对有状态会话 bean 的引用存储到静态变量、使用全局(静态)JSP 变量来引用有状态 SessionBean 引用或者将有状态 SessionBean 引用存储在 HTTP 会话对象中时经常会发生此情况。然后,在完成前一个请求之前,应用程序让客户端浏览器发出对 servlet 或 JSP 文件的新请求。

要解决此问题,要求客户机代码的开发者查看这些条件的代码。

抛出 CSITransactionRolledbackException / TransactionRolledbackException

[AIX Solaris HP-UX Linux Windows][IBM i]企业 Bean 容器生成这些高级别异常以表明企业 Bean 调用未完成。当抛出此异常时,浏览 JVM 日志以确定根本原因。

[z/OS]企业 Bean 容器生成这些高级别异常以表明企业 Bean 调用未完成。当抛出此异常时,浏览日志以确定根本原因。

一些可能的原因包括:
  • 企业 Bean 可能抛出不作为其方法特征符的一部分声明的异常。在这种情况下,需要容器来回滚事务。通常发生此情况的原因是企业 Bean 或它调用的代码在哪里产生 NullPointerException、ArrayIndexOutOfBoundsException 或其他 Java 运行时异常,或者,在哪里 BMP bean 遇到 JDBC 错误。解决方法是调查该企业 Bean 代码,并解析底层的异常,或者将异常添加到问题方法特征符。
  • 事务可能在处于“Marked Rollback”、“RollingBack”或“RolledBack”状态后尝试执行其他一些工作。事务不能在设置成这些状态中的其中一个状态后继续工作。发生此情况的原因是事务已超时,而事务超时通常是由数据库死锁引起的。使用应用程序数据库管理器工具或者让管理员来确定由企业 Bean 调用的数据库事务是否已超时。
  • 由于来自局部事务的悬挂工作,在事务落实时可能会失败。在落实期间,局部事务遇到一些“待定工作”。当局部事务遇到“未解决的操作”时,缺省操作是“回滚”。您可以使用组装工具将此操作调整为“落实”。

尝试启动 EJB 模块失败,发生了“javax.naming.NameNotFoundException dataSourceName_CMP”异常

会发生此问题的原因是:
  • 配置 DataSource 资源时未选择容器管理的持久性。
    • 要确认该问题,在管理控制台中,浏览 NameNotFoundException 中给定的数据源的属性。在“配置”面板上,查找标注为容器管理的持久性的复选框。
    • 要解决此问题,选择容器管理的持久性复选框。
  • 如果选择了容器管理的持久性,可能未将 CMP 数据源与名称空间绑定。
    • [AIX Solaris HP-UX Linux Windows][IBM i]在状态栏和主管应用程序服务器 JVM 日志中查找其他命名警告或错误。检查您通过查看主题应用程序访问问题发现的任何更多命名异常问题。
    • [z/OS]在状态栏和主管应用程序服务器日志中查找其他命名警告或错误。检查您通过查看主题应用程序访问问题发现的任何更多命名异常问题。
[AIX Solaris HP-UX Linux Windows][IBM i]

访问企业 Bean 时,事务 [tran ID] 在 120 秒后超时

当客户机在 CMP 或 BMP 企业 Bean 上执行事务 时会发生此错误。
  • 企业 Bean 事务的缺省超时值是 120 秒。过了该时间,事务超时并且连接关闭。
  • 如果事务正当地耗用了超出指定超时时间段的时间,请转到管理应用程序服务器 server_name,选择事务服务属性页面,然后查看属性事务生存期超时总计。如果必要,增大此值并保存配置。
[z/OS]

发出消息 BBOT0003W

消息 BBOT0003W 表明事务超时。超时可能导致运行事务的服务方异常终止。
  • 企业 Bean 事务的缺省超时值是 120 秒。过了该时间,事务超时并且连接关闭。
  • 如果事务合法地花费了长于指定超时周期的时间,那么在管理控制台上:
    1. 转到管理应用程序服务器 > server_name
    2. 选择事务服务属性页面
    3. 增加总计事务生存期超时
    4. 保存配置
    注: z/OS 将使用您为总计事务生存期超时设置的值作为缺省事务超时设置。如果为此属性设置大于最长事务超时值的值,那么 z/OS 将使用最长事务超时值作为缺省值。

症状:CNTR0001W: 有状态的 SessionBean 不能被钝化

当在 bean 中使用的连接对象未关闭或无效时,会发生此错误。

[AIX Solaris HP-UX Linux Windows][IBM i]要确认是这种问题,在主管企业 Bean 的 EJB 容器的 JVM 日志中查找异常堆栈,它看上去类似于以下异常:
[time EDT] <ThreadID> StatefulPassi W CNTR0001W: 
A Stateful SessionBean could not be passivated: StatefulBeanO
(BeanId(XXX#YYY.jar#ZZZZ, <ThreadID>), 
state = PASSIVATING) com.ibm.ejs.container.passivator.StatefulPassivator@<ThreadID>
java.io.NotSerializableException: com.ibm.ws.rsadapter.jdbc.WSJdbcConnection 
 at java.io.ObjectOutputStream.outputObject((Compiled Code)) 
 at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java(Compiled Code)) 
 at java.io.ObjectOutputStream.outputClassFields((Compiled Code)) 
 at java.io.ObjectOutputStream.defaultWriteObject((Compiled Code)) 
 at java.io.ObjectOutputStream.outputObject((Compiled Code)) 
 at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java(Compiled Code)) 
 at com.ibm.ejs.container.passivator.StatefulPassivator.passivate((Compiled Code)) 

 at com.ibm.ejs.container.StatefulBeanO.passivate((Compiled Code) 
 at com.ibm.ejs.container.activator.StatefulASActivationStrategy.atUnitOfWorkEnd
                      ((Compiled Code)) 
 at com.ibm.ejs.container.activator.Activator.unitOfWorkEnd((Compiled Code)) 
 at com.ibm.ejs.container.ContainerAS.afterCompletion((Compiled Code)
其中 XXX,YYY,ZZZ 是 Bean 名称,而 <ThreadID> 是用于此次运行的线程标识。
[z/OS]要确认是这种问题,在主管企业 Bean 的 EJB 容器的日志中查找异常堆栈,它看上去类似于以下异常:
StatefulPassi W CNTR0001W: 
A Stateful SessionBean could not be passivated: StatefulBeanO
(BeanId(XXX#YYY.jar#ZZZZ), 
state = PASSIVATING) 
java.io.NotSerializableException: com.ibm.ws.rsadapter.jdbc.WSJdbcConnection 
 at java.io.ObjectOutputStream.outputObject((Compiled Code)) 
 at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java(Compiled Code)) 
 at java.io.ObjectOutputStream.outputClassFields((Compiled Code)) 
 at java.io.ObjectOutputStream.defaultWriteObject((Compiled Code)) 
 at java.io.ObjectOutputStream.outputObject((Compiled Code)) 
 at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java(Compiled Code)) 
 at com.ibm.ejs.container.passivator.StatefulPassivator.passivate((Compiled Code)) 

 at com.ibm.ejs.container.StatefulBeanO.passivate((Compiled Code) 
 at com.ibm.ejs.container.activator.StatefulASActivationStrategy.atUnitOfWorkEnd
                      ((Compiled Code)) 
 at com.ibm.ejs.container.activator.Activator.unitOfWorkEnd((Compiled Code)) 
 at com.ibm.ejs.container.ContainerAS.afterCompletion((Compiled Code)
其中 XXX,YYY,ZZZ 是 Bean 名称。

要解决此问题,应用程序必 须关闭所有连接,并设置所有连接的引用为空。通常,此活动通过 Bean 的 ejbPassivate() 方法完成。还要请注意,必须对该 bean 进行编码以在重新激活 bean 时重新获得这些连接。否则,当应用程序尝试复用连接时会有 NullPointerException。

[AIX Solaris HP-UX Linux Windows][IBM i]

症状:org.omg.CORBA.BAD_PARAM:Servant 不是所期望的类型。次代码:4942F21E 已完成:否

当程序尝试执行 EJB 方法时,此错误可能会返回到客户机程序中。

此问题通常是由于客户机与服务器安装之间的接口定义和实现不匹配所致。

另一个可能的原因是当设置应用程序服务器以使用单个类装入方案。如果在应用程序服务器保持活动时卸载应用程序,那么已卸载应用程序的类仍装入在应用程序服务器中。如果更改应用程序,并在应用程序服务器上重新部署和重新安装它,那么先前装入的类成为后备级别。后备级别的类导致客户机与服务器之间代码版本不匹配。

要解决此问题,请执行以下操作:
  1. 将应用程序服务器类装入方案更改为多个
  2. 停止和重新启动应用程序服务器并再次尝试操作。
  3. 确保客户机和服务器的代码版本相同。

指示主题类型的图标 参考主题



时间戳记图标 最近一次更新时间: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=rtrb_ejbaccessprobs
文件名:rtrb_ejbaccessprobs.html