Java 在Weblogic 10.3中调用EJB时发生NameNotFoundException

Java 在Weblogic 10.3中调用EJB时发生NameNotFoundException,java,ejb-3.0,weblogic,weblogic-10.x,stateless-session-bean,Java,Ejb 3.0,Weblogic,Weblogic 10.x,Stateless Session Bean,我将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

我将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'

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

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

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

这是理论部分。现在是实践。在您的情况下,从我所看到的,您正在从Weblogic访问EJB,因此我宁愿使用no-arg
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");

您的bean是否有多个远程业务接口?是的,HelloWorld接口。对不起,我的名字很蹩脚。我正在尝试熟悉ejb。这只是一个,而不是多个:)无论如何,我已经回答了这两种情况。我不确定您是否收到了通知,所以我将我的答案粘贴在这里:在@Stateless中,@name()是ejb-jar.xml中的等价注释。如果未指定@Stateless name(),则默认为非限定的bean类名。所以我不知道“myBean”是从哪里来的。然后,是的,您的EJB在JNDI树中应该明确显示为“HelloWorld”(您指定的名称)。您确定部署进行得很顺利并且您的EJB已经部署好了吗?是的,我的bean似乎已经正确部署。WL中没有错误,管理控制台中的部署页面显示类型为“Library”的“MyBean”部署的状态为“Active”。Pascal:我尝试了ic.lookup(“HelloWorld#com.foo.HelloWorld”),得到了与上面相同的错误。我尝试了ic.lookup(“HelloWorld”),得到了与上面相同的错误:javax.naming.NameNotFoundException:无法解析“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:w/my.jar文件出了问题。一旦我修好了,一切都正常了。谢谢你的帮助。
(HelloWorld) ic.lookup("HelloWorld");