【问题标题】:NameNotFoundException when calling a EJB in Weblogic 10.3在 Weblogic 10.3 中调用 EJB 时出现 NameNotFoundException
【发布时间】:2010-12-09 18:18:17
【问题描述】:

我有一个这样定义的 EJB:

package com.foo;
@Stateless (mappedName="HelloWorld")
public class HelloWorldBean implements HelloWorld, HelloWorldLocal
....

当它部署到 Weblogic (WL) 时,它的名称为 myBean。我不确定这是否重要。

我尝试使用以下代码调用 bean:

Hashtable ht = new Hashtable();
ht.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
ht.put(Context.PROVIDER_URL, "t3://localhost:7001");
ic = new InitialContext(ht);
tp = (HelloWorld) ic.lookup("HelloWorld#com.foo.HelloWorldBean");

有人知道我为什么会收到以下错误吗?

javax.naming.NameNotFoundException: While trying to lookup 'HelloWorld#com.foo.HelloWorldBean' didn't find subcontext 'HelloWorld#com'.
 Resolved '' [Root exception is javax.naming.NameNotFoundException: While trying
 to lookup 'HelloWorld#com.foo.HelloWorldBean' didn't find
 subcontext 'HelloWorld#com'. Resolved '']; remaining name 'HelloWorld#com/foo/HelloWorldBean'

【问题讨论】:

  • 你的bean有多个远程业务接口吗?
  • 是的,HelloWorld 界面。对不起蹩脚的名字。我正在尝试熟悉 EJB。
  • 这只是一个,不是多个 :) 无论如何我都回答了​​这两种情况。
  • 不确定您是否收到通知,所以我将答案粘贴在这里:在@Stateless 中,@name() 是 ejb-jar.xml 中 的注释等效项。如果未指定 @Stateless name(),则默认为非限定 bean 类名。所以我不知道“myBean”是从哪里来的。那么,是的,您的 EJB 绝对应该在 JNDI 树中显示为“HelloWorld”(您指定的名称)。您确定部署顺利并且您的 EJB 已部署?
  • 是的,看来我的 bean 部署正确。 WL 没有错误,管理控制台中的“部署”页面显示“库”类型的“MyBean”部署状态为“活动”。

标签: java ejb-3.0 weblogic weblogic-10.x stateless-session-bean


【解决方案1】:

要查找具有多个远程业务接口(例如com.acme.FooBusiness1、com.acme.FooBusiness2)的会话 Bean 的远程接口,您需要查找从目标 ejb 的全局 JNDI 名称(mappedName()在@Stateless) 和特定的远程业务接口,用“#”分隔:

InitialContext ic = new InitialContext();
FooBusiness1 bean1 = (FooBusiness1) ic.lookup("FooEJB#com.acme.FooBusiness1");
FooBusiness2 bean2 = (FooBusiness2) ic.lookup("FooEJB#com.acme.FooBusiness2");

在 bean 只有一个远程业务接口的典型情况下,不需要这种完全限定的形式。在这种情况下,可以直接使用 bean 的 JNDI 名称:

FooBusiness bean = (FooBusiness) ic.lookup("FooEJB");

那是理论部分。现在练习。在您的情况下,据我所知,您正在从 Weblogic 访问 EJB,所以我宁愿使用无参数 InitialContext() 构造函数(并在其他环境中使用 jndi.properties 配置文件)但这只是一方面笔记。然后,您应该查找com.foo.HelloWorld,远程接口,而不是com.foo.HelloWorldBean,实现:

InitialContext ic = new InitialContext();
(HelloWorld) ic.lookup("HelloWorld#com.foo.HelloWorld");

如果你的 bean 只有一个远程业务接口,这应该可以工作:

(HelloWorld) ic.lookup("HelloWorld");

【讨论】:

  • Pascal:我尝试了 ic.lookup("HelloWorld#com.foo.HelloWorld") 并得到与上述相同的错误。我尝试了 ic.lookup("HelloWorld") 并得到与上面相同的错误:javax.naming.NameNotFoundException: Unable to resolve 'HelloWorld'。已解决 '' [根异常是 javax.naming.NameNotFoundException:无法解析 'HelloWorld'。解决 ''];剩余名称“HelloWorld”
  • 我将 EJB 部署到 Weblogic,它在 WL 管理控制台的部署页面中显示为 myBean。然而,当我查看 JNDI 树时,我在该树的任何地方都找不到 myBean 或 HelloWorld。也许这是一个线索?
  • 在@Stateless 中,@name() 是 ejb-jar.xml 中 的注解等价物。如果未指定 @Stateless name(),则默认为不合格的 bean 类名。所以我不知道“myBean”是从哪里来的。那么,是的,您的 EJB 绝对应该在 JNDI 树中显示为“HelloWorld”(您指定的名称)。您确定部署顺利并且您的 EJB 已部署?
  • Pascal:我的 .jar 文件搞砸了。一旦我解决了这个问题,一切正常。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多