2009-10-24 34 views
7

一個EJB時,我有被定義爲這樣的EJB:調用的NameNotFoundException中的Weblogic 10.3

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

當它部署到WebLogic(WL),它會被命名爲myBean。我不確定這是否重要。

我嘗試調用此代碼豆:

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

貴豆有多個遠程業務接口? – 2009-10-24 17:03:16

+0

是的,HelloWorld界面。對不起,跛腳的名字。我試圖熟悉EJB。 – Sajee 2009-10-24 17:22:23

+0

這只是一個,不是多個:)我已經回答了這兩種情況。 – 2009-10-24 17:29:47

回答

10

查找會話bean的遠程接口與多個遠程業務接口(例如com.acme.FooBusiness1com.acme.FooBusiness2),你需要查找的目標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,所以我寧願使用無參數構造函數(並且在其他環境中使用jndi.properties配置文件),但這只是一個附註。然後,你應該看看了com.foo.HelloWorld,遠程接口,而不是com.foo.HelloWorldBean,執行:

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

如果你的bean只有一個遠程業務接口,這應該工作:

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

Pascal:我試過ic.lookup(「HelloWorld#com.foo.HelloWorld」),我得到了和上面一樣的錯誤,我嘗試了ic.lookup(「HelloWorld」)並得到與上面相同的錯誤:javax.naming.NameNotFoundException:無法解析'HelloWorld'。已解決 ''[根異常是javax.naming.NameNotFoundException:無法解析'HelloWorld'。解決''];其餘名稱'HelloWorld' – Sajee 2009-10-24 17:32:57

+0

我將EJB部署到Weblogic,它在WL管理控制檯的Deployments頁面中顯示爲myBean,但是當我查看JNDI樹時,我無法在樹中的任何位置找到myBean或HelloWorld。線索? – Sajee 2009-10-24 17:40:17

+0

在@Stateless中,@name()是ejb-jar.xml中等效於的註釋。如果未指定@Stateless name(),則默認爲未限定的bean類名稱。所以我不知道「myBean」從哪裏來。那麼,是的,您的EJB肯定應該在JNDI樹中作爲「HelloWorld」(您指定的名稱)可見。你確定部署進展順利嗎?你的EJB部署了嗎? – 2009-10-24 18:30:14