来自JNDI的对象引用查找导致ClassCastException

tpu*_*nen 2 java jboss jndi jboss5.x ejb-3.0

我在容器外调用EJB3无状态bean时遇到问题.

获取对象引用的代码:

Context envCtx = (Context) context.lookup("ejb");
MyObject o = (MyObject) envCtx.lookup(MyObject);
Run Code Online (Sandbox Code Playgroud)

第二行导致异常:

java.lang.ClassCastException: javax.naming.Reference
Run Code Online (Sandbox Code Playgroud)

我使用JBoss.org 5.1.0 GA.

根据其他一些帖子,我怀疑这可能是由于客户端库的错误版本所致.但是,我不确定哪个库jar应该包含在jar中?(我使用5.0.4.GA jnpserver获取错误.)

Pas*_*ent 5

对于JBoss,您的代码应该类似于:

Properties properties = new Properties();
properties.put("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
properties.put("java.naming.factory.url.pkgs","=org.jboss.naming:org.jnp.interfaces");
properties.put("java.naming.provider.url","localhost:1099");

Context context = new InitialContext(properties);
(EchoBeanRemote) c.lookup("EchoBean/remote");
Run Code Online (Sandbox Code Playgroud)

如果您愿意,可以将JNDI环境设置放在一个jndi.properties文件中(需要在类路径中):

java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=jnp://localhost:1099
Run Code Online (Sandbox Code Playgroud)

并使用非arg InitialContext构造函数:

Context context = new InitialContext();
(EchoBeanRemote) c.lookup("EchoBean/remote");
Run Code Online (Sandbox Code Playgroud)

这显然更便携.

在这两种情况下,您都需要jbossall-client.jar在客户端的类路径上.

PS:您可以在 基于Web的JMX控制台的JNDI视图中检查您的bean注册的全局JNDI名称(如果它仍然存在).