从 JNDI 查找对象引用会导致 ClassCastException

发布于 2024-08-19 23:38:12 字数 404 浏览 4 评论 0原文

我在容器外部调用 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 收到错误。)

I'm having problems calling EJB3 stateless bean outside the container.

Code for getting the object reference:

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

The second row results in exception:

java.lang.ClassCastException: javax.naming.Reference

I use JBoss.org 5.1.0 GA.

Based on some other posts I suspect this might be due to wrong version of client libraries. However, I'm unsure which library jar(s) I should include in the jar? (I get the error using 5.0.4.GA jnpserver.)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

帥小哥 2024-08-26 23:38:12

对于 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:您可以在基于 Web 的 JMX 控制台的 JNDI 视图 中检查您的 Bean 注册的全局 JNDI 名称(如果它仍然存在)。

For JBoss, your code should look something like that:

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");

If you prefer, you can put the JNDI environement settings in a jndi.properties file (that needs to be on the classpath):

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

And use the non-arg InitialContext constructor:

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

This is obviously more portable.

And in both case, you'll need jbossall-client.jar on the classpath on the client side.

P.S.: You can check the Global JNDI Name your bean is registered at in the JNDI View of the web-based JMX console (if it still exists).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文