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'
4

1 回答 1

10

要查找具有多个远程业务接口(例如 )的会话 Bean 的远程接口com.acme.FooBusiness1com.acme.FooBusiness2您需要查找从目标 ejb 的全局 JNDI 名称(mappedName()in @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");
于 2009-10-24T17:27:03.187 回答