应用程序访问问题
要解决 Servlet、JavaServer Pages 文件、独立应用程序或其他客户机尝试访问 WebSphere® Application Server 主管的企业 Bean、连接池或其他指定对象时遇到的问题,必须先验证能否从客户机访问目标服务器。
- 从客户机服务器上的命令提示符中,输入 ping server_name 并验证连接。
- 使用管理控制台验证目标资源的应用程序服务器是否已启动,如果适用,还请验证企业 Bean (EJB) 模块或 Web 模块是否已启动。
只有当没有连接性问题并且目标资源显示在运行时才继续。
- 来自 JNDI 查找操作的 NameNotFoundException
- 来自 JNDI 查找操作的 CannotInstantiateObjectException
- 消息 NMSV0610I 出现在服务器的日志文件中,表明已发生某些命名异常
- 来自 JNDI 上下文操作的 OperationNotSupportedException
- WSVR0046E: 未能绑定,ejb/jndiName: ejb/jndiName。原始异常:org.omg.CosNaming.NamingContextPackage.AlreadyBound
- 来自“新建初始上下文”操作或具有 URL 名称的 JNDI 上下文操作的 ConfigurationExceptionfrom
- 来自“新建初始上下文”操作的 ServiceUnavailableException
- 从“新建初始上下文”操作抛出的 CommunicationException
NMSV0605E: 从上下文中查找的引用对象...
如果没有看到与您的问题类似的问题,或所提供的信息未解决您的问题,请联系 IBM® 技术支持以获取进一步的帮助。
来自 JNDI 查找操作的 NameNotFoundException
产生 NameNotFoundException 有三个原因:
- 查找名称不正确
- 如果在尝试访问企业 Bean、数据源、消息传递资源或其他资源时遇到 NameNotFoundException:
- 确定产生 NameNotFoundException 的原因。
在管理控制台中浏览目标对象的属性,并验证它指定的 Java™ 命名和目录接口 (JNDI) 名称是否与客户机正在使用的 JNDI 名称相匹配。
如果查找的对象所在的服务器不同于获取初始上下文的服务器,那么您必须使用标准名称。- 如果访问来自另一个服务器对象(如,访问企业 Bean 的 servlet)并且您正在使用缺省上下文,而不是指定标准 JNDI 名称,若此对象在另一台服务器上,就可能会产生 NameNotFoundException。
- 如果访问来自独立的客户机,那么原因可能是,您尝试访问的对象所在的服务器并非您从中获取初始上下文的服务器。
- 使用标准 JNDI 名称来解决问题。如果对象在单个服务器中,那么标准 JNDI 名称如下所示:
cell/nodes/nodeName/servers/serverName/jndiName
限制: 此发行版中不支持这些对象。如果对象在服务器集群中,那么标准 JNDI 名称如下所示:cell/clusters/clusterName/jndiName
- 确定产生 NameNotFoundException 的原因。
- 未绑定要查找的对象
- 要解决未绑定要查找的对象时出现的 NameNotFoundException:
- 如果要查找的对象是应用程序对象,如企业 Bean,那么确保该应用程序正在运行。
- 运行 dumpNameSpace tool 来查看名称空间的内容以核实要查找的对象已绑定至具有期望名称的名称空间。
- 使用在同一台主机上运行的两个同名服务器来进行互操作
- 如果在 node1 中的服务器上运行的应用程序对位于 node2 中名称类似的服务器上的对象使用远程对象引用,并且这两个节点安装在同一主机上,那么可能会出现几个不同的故障:
- JNDI 查询失败,且抛出 NameNotFoundException。
- 通过 JNDI 查询之外的方法获得的对象引用失败,很有可能抛出 org.omg.CORBA.OBJECT_NOT_EXIST 异常。
- 远程对象引用错误地解析为本地进程中的一个对象,因为本地进程中已存在该对象。即,对 node2 中服务器进程上的远程对象的引用在本地进程(也就是 node1 中的服务器进程)中错误地解析为同一种对象。
对于不同节点中和不同主机上的服务器之间的对象引用,即使服务器名不唯一,也不会产生异常。
要解决这些故障,对于任一服务器或两个服务器,将对象请求代理 (ORB) 的 Java 虚拟机 (JVM) 定制属性 com.ibm.websphere.orb.uniqueServerName 设置为 true:- 在管理控制台中,单击 。
- 在“定制属性设置”页上,定义定制属性:
- 对于名称,指定 com.ibm.websphere.orb.uniqueServerName。
- 对于值,指定 true。
- 单击确定。
- 在控制台任务栏上单击保存。
- 重新启动应用程序服务器。
要防止 Node Agent 出现类似故障,可以将 Node Agent 的 ORB Java 虚拟机定制属性 com.ibm.websphere.orb.uniqueServerName 设置为 true。
来自 JNDI 查找操作的 CannotInstantiateObjectException
- 正在查找序列化的 Java 对象,但反序列化此对象所必需的类不在运行时环境中。
- 正在查找参考对象,并且作为查找处理的一部分来处理它而使用的关联工厂发生故障。
- 查找刚好位于 CannotInstantiateObjectException 前面的异常的相关日志。如果它是 java.lang.NoClassDefFoundError 或 java.lang.ClassNotFoundException,请确保类装入器可以找到错误消息中引用的类。。
查看 JVM 日志。
查看主管目标资源的服务器的日志。
- 打印出根本原因的堆栈跟踪并查找工厂类。它将由 javax.naming.NamingManager.getObjectInstance() 调用。故障原因将取决于工厂实现,并且可能要求您联系工厂类的开发者。
消息 NMSV0610I 出现在服务器的日志文件中,表明已发生某些命名异常
此错误只是参考错误,并且在异常与实际问题相关的情况下提供。大多数情况下,它不是参考错误。如果它是,日志文件应包含相邻的条目以提供上下文。
- 如果没有遇到任何问题,那么忽略此消息。如果遇到的问题仿佛与正在报告的异常不相关,并且此日志中没有其他相邻的错误消息,那么同样忽略此消息。
- 如果遇到一个问题,那么查看此日志以获取底层错误消息。
- 消息 NMSV0610I 中提供的信息可为响应发生的命名异常而公布的其他相邻错误消息提供有用的调试数据。
来自 JNDI 上下文操作的 OperationNotSupportedException
- 正在使用以“java:comp/env”开始的名称执行更新操作(如,绑定)。此上下文及其子上下文是只读上下文。
- 正在不属于产品的远程名称空间上执行非 CORBA 对象的上下文绑定或重新绑定操作。只有 CORBA 对象可与这些 CosNaming 名称空间绑定。
要确定这些错误中的哪个错误引起了此问题,请检查完整的异常消息。
WSVR0046E: 未能绑定,ejb/jndiName: ejb/jndiName。原始异常:org.omg.CosNaming.NamingContextPackage.AlreadyBound
两个企业 Bean 服务器应用程序安装在同一台服务器上以至发生了绑定名称冲突时,会发生此错误。即,jndiName 值在两个应用程序的部署描述符中是相同的。当启动使用该 jndiName 值的第二个应用程序时,在服务器启动期间将出现此错误。
要验证这是一个问题,检查在服务器中运行的所有企业 Bean 服务器应用程序的部署描述符,以搜索在多个企业 Bean 应用程序中指定的 jndiName。
要解决此问题,更改任何重复的 jndiName 值以确保以不同的名称绑定服务器进程中的每个企业 Bean。
来自“新建初始上下文”操作或具有 URL 名称的 JNDI 上下文操作的 ConfigurationExceptionfrom
如果尝试获取初始 JNDI 上 下文,那么可能会发生配置异常,因为无效的 JNDI 属性值传递到 InitialContext 构造函数。这包括在系统属性或有效的类装入器可见的某些 jndi.properties 文件中设置的 JNDI 属性。格式不正确的提供程序 URL 是最可能不正确的属性。如果 JNDI 客户机作为瘦客户机运行以致 CLASSPATH 设置为包含所需的所有独立的 jar 文件,确保包含属性文件 com/ibm/websphere/naming/jndiprovider.properties 的 .jar 文件位于 CLASSPATH。
如果具有 URL 格式名称的 JNDI 上下文调用发生异常,那么可能未正确设置当前 JNDI 配置,从而导致了无法确定所需的工厂类名或者此工厂对于当前有效的类装入器可能不是可见的。如果名称是 Java: URL,那么 JNDI 客户机必须在 Java Platform, Enterprise Edition (Java EE) 客户机或服务器环境中运行。即,客户机必须在容器中运行。
检查异常消息以验证原因。
如果正在从 InitialContext 构造函数抛出异常,那么更正属性设置或 CLASSPATH。
如果正在从 JNDI 上下文方法抛出异常,那么确保属性 java.naming.factory.url.pkgs 在名称中包含 URL 方案所需的工厂的包名称。只有在容器中运行时,才可使用具有 Java 方案的 URL 名称。
从“新建初始上下文”操作抛出的 CommunicationException
- 提供程序 URL 中的主机名或端口不正确。
- 域名服务器无法将主机名解析为 IP 地址,或者此 IP 地址不匹配服务器实际运行所在的 IP 地址。
- 客户机或服务器上的防火墙防止使用提供程序 URL 中指定的端口。
- 确保客户机和服务器上的提供程序 URL 和网络配置正确。
- 确保主机名可解析为客户端机器能到达的 IP 地址。您可使用此 ping 命令执行它。
- 如果正在运行防火墙,那么确保允许使用提供程序 URL 中指定的端口。