在Weblogic 10.3中调用EJB时出现了NameNotFoundException

7

我有一个这样定义的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'

1
你的Bean是否有多个远程业务接口? - Pascal Thivent
那只有一个,不是多个 :) 我已经回答了两种情况。 - Pascal Thivent
不确定您是否收到通知,所以我在这里粘贴我的答案:在@Stateless中,@name()是ejb-jar.xml中<ejb-name>的注释等效项。如果未指定@Stateless name(),则默认为未限定的bean类名称。所以我不知道“myBean”来自哪里。然后,是的,您的EJB肯定应该作为“HelloWorld”(您指定的名称)显示在JNDI树中。您确定部署成功并且已部署EJB吗? - Pascal Thivent
是的,看起来我的Bean已经成功部署了。没有WL错误,并且管理控制台中的部署页面显示“MyBean”部署类型为“Library”,状态为“Active”。 - Sajee
+1. 我也在为同样的问题苦苦挣扎 :-( - Leonel
显示剩余2条评论
1个回答

10

如果需要查找一个具有多个远程业务接口(例如 com.acme.FooBusiness1com.acme.FooBusiness2)的会话Bean的远程接口,您需要查找一个名称,该名称由目标EJB的全局JNDI名称(@Stateless中的mappedName())和特定的远程业务接口组合而成,用“#”分隔:

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名称:

在典型情况下,如果一个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: 无法解析“HelloWorld”。已解决'' [根异常是javax.naming.NameNotFoundException: 无法解析“HelloWorld”。已解决“”];剩余名称“HelloWorld”。 - Sajee
我将EJB部署到Weblogic中,在WL管理控制台的部署页面中它显示为myBean。但是当我查看JNDI树时,无法在该树中找到myBean或HelloWorld。也许这是一个线索? - Sajee
在@Stateless中,@name()是ejb-jar.xml中<ejb-name>的注释等效项。如果未指定@Stateless name(),则默认为未限定的bean类名称。所以我不知道"myBean"来自哪里。然后,是的,您的EJB肯定应该作为"HelloWorld"(您指定的名称)出现在JNDI树中。您确定部署成功并且已部署EJB吗? - Pascal Thivent
Pascal:我的.jar文件出了点问题,修复后一切正常。感谢您的帮助。 - Sajee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接