从独立客户端查找远程 EJB 时出现 AssertionError "Context may not be null"

AssertionError "Context may not be null" when looking up remote EJB from standalone client

我是 运行 WebLogic 12c 并且将几个 bean 部署为 EAR 文件的一部分。我还有一个来自 Eclipse 运行 的独立客户端,它试图访问远程 EJB。我正在使用注释,因此使用了来自 EJB 3.1 的全局可移植 JNDI 名称(例如 java:global/ifactory/ifactory-ejb-4.0.0/BomServiceBean!com.icumed.ifactory3.service.BomServiceRemote).

但是,当远程客户端尝试调用 EBJ 时,出现以下异常:

11:45:03,400 ERROR [com.icumed.ifactory3.service.RemoteServiceFactoryImpl] [getService('java:global/ifactory/ifactory-ejb-4.0.0/BomServiceBean!com.icumed.ifactory3.service.BomServiceRemote')] Context may not be null
java.lang.AssertionError: Context may not be null
    at weblogic.j2eeclient.SimpleContext.checkForNameUnderRemoteNode(SimpleContext.java:103)
    at weblogic.j2eeclient.SimpleContext.internalLookup(SimpleContext.java:68)
    at weblogic.j2eeclient.SimpleContext.lookup(SimpleContext.java:39)
    at weblogic.jndi.SimpleContext.lookup(SimpleContext.java:86)
    at javax.naming.InitialContext.lookup(InitialContext.java:411)
    at com.icumed.ifactory3.service.RemoteServiceFactoryImpl.getService(RemoteServiceFactoryImpl.java:323)

bean 看起来像这样:

@Stateless
public class BomServiceBean extends AbstractSessionBean implements LocalBomService, BomServiceRemote
{
  ...
}

更多信息:当 wlthint3client.jar 和 wlclient.jar 在类路径上时会发生此错误。

当类路径上只有wlthint3client.jar时,例外是

java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Long
    at weblogic.rmi.internal.StubInfo.getEnvQueriedJNDITimeout(StubInfo.java:256)
    at weblogic.rmi.internal.StubInfo.setEnvQueriedJNDITimeout(StubInfo.java:242)
    at weblogic.rmi.internal.StubInfo.readObject(StubInfo.java:238)

当 wlclient.jar 和 wlthint3client.jar 在类路径上时,WebLogic 打印此日志消息:

The connection attempt was rejected because the incoming protocol iiop is not enabled on channel Default[iiop][12]

我该如何纠正?

首先,确保类路径中只有 wlthint3client.jar 而不是 wlclient.jar。这将摆脱 AssertionError 并只留下 ClassCastException。

其次,ClassCastException问题出在wlthint3client.jar(StubInfo.java)的代码中。如果您在 jndi.properties 文件中指定以下两个属性,则它们无法从 String 正确转换为 Long。

Long o = (Long)props.get("weblogic.jndi.responseReadTimeout");

if (o == null) {
  o = (Long)props.get("weblogic.rmi.clientTimeout");
}

如果您需要设置这些属性,则必须在您的代码中创建一个哈希表并将其传递给 InitialContext。

Hashtable<String, Object> env = new Hashtable<String, Object>();

env.put("weblogic.jndi.responseReadTimeout", 15000L);
env.put("weblogic.rmi.clientTimeout", 15000L);