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

时间:2010-01-29 16:17:26

标签: java jboss ejb-3.0 jndi jboss5.x

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

获取对象引用的代码:

Context envCtx = (Context) context.lookup("ejb");
MyObject o = (MyObject) envCtx.lookup(MyObject);

第二行导致异常:

java.lang.ClassCastException: javax.naming.Reference

我使用JBoss.org 5.1.0 GA。

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

1 个答案:

答案 0 :(得分: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");

如果您愿意,可以将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

并使用非arg InitialContext构造函数:

Context context = new InitialContext();
(EchoBeanRemote) c.lookup("EchoBean/remote");

这显然更具便携性。

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

PS:您可以检查您的bean在基于Web的JMX控制台的 JNDI View 中注册的全局JNDI名称(如果它仍然存在)。< / p>