2010-01-29 51 views
2

我在調用容器外的EJB3無狀態bean時遇到問題。來自JNDI的對象引用查找導致ClassCastException

代碼獲取對象的引用:

Context envCtx = (Context) context.lookup("ejb"); 
MyObject o = (MyObject) envCtx.lookup(MyObject); 

第二行導致異常:

java.lang.ClassCastException: javax.naming.Reference 

我用JBoss.org 5.1.0 GA。

基於一些其他職位,我懷疑這可能是由於客戶端庫的錯誤版本。但是,我不確定哪些庫jar應該包含在jar中? (我使用5.0.4.GA jnpserver得到的錯誤。)

回答

5

對於JBoss,你的代碼看起來應該是這樣的:

Properties properties = new Properties(); 
properties.put("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory"); 
properties.put("java.naming.factory.url.pkgs","=org.jboss.naming:org.jnp.interfaces"); 
properties.put("java.naming.provider.url","localhost:1099"); 

Context context = new InitialContext(properties); 
(EchoBeanRemote) c.lookup("EchoBean/remote"); 

如果你願意,你可以把JNDI environement設置在jndi.properties文件(需要在類路徑):

java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory 
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces 
java.naming.provider.url=jnp://localhost:1099 

,並使用無參構造函數InitialContext

Context context = new InitialContext(); 
(EchoBeanRemote) c.lookup("EchoBean/remote"); 

這顯然更便攜。

在這兩種情況下,您需要在客戶端的類路徑上使用jbossall-client.jar

P.S:您可以檢查全局JNDI名稱你的bean在JNDI查找基於Web的控制檯JMX的註冊的(如果它仍然存在)。

相關問題