从独立客户端查找远程EJB时出现AssertionError“上下文可能不为空”

时间:2019-03-19 20:18:09

标签: java jndi weblogic12c ejb-3.1

我正在运行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]

我该如何纠正?

1 个答案:

答案 0 :(得分:0)

首先,确保您在类路径中只有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");
}

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

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

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