我有一个 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 的远程接口(例如com.acme.FooBusiness1
, com.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,所以我宁愿使用 no-argInitialContext()
构造函数(并使用jndi.properties
其他环境的配置文件)但这只是一个旁注。那么你应该抬头看看com.foo.HelloWorld
,远程接口,不是com.foo.HelloWorldBean
,实施:
InitialContext ic = new InitialContext();
(HelloWorld) ic.lookup("HelloWorld#com.foo.HelloWorld");
如果您的 bean 只有一个远程业务接口,那么这应该可以工作:
(HelloWorld) ic.lookup("HelloWorld");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)