2009-09-24 73 views
10

我已在我的web.xml中有以下故障:EJB查找與NamingException的

public UserManager getUserManager() throws HUDException { 
    String ROLE_JNDI_NAME = "ejb/userManagerBean"; 
    try { 
     Properties props = System.getProperties(); 
     Context ctx = new InitialContext(props); 
     UserManagerHome userHome = (UserManagerHome) ctx.lookup(ROLE_JNDI_NAME); 
     UserManager userManager = userHome.create(); 
     WASSSecurity user = userManager.getUserProfile("user101", null); 
     return userManager; 
    } catch (NamingException e) { 
     log.error("Error Occured while getting EJB UserManager" + e); 
     return null; 
    } catch (RemoteException ex) { 
     log.error("Error Occured while getting EJB UserManager" + ex); 
     return null; 
    } catch (CreateException ex) { 
     log.error("Error Occured while getting EJB UserManager" + ex); 
     return null; 
    } 
} 

的代碼在容器內使用:

<ejb-ref> 
     <ejb-ref-name>ejb/userManagerBean</ejb-ref-name> 
     <ejb-ref-type>Session</ejb-ref-type> 
     <home>gha.ywk.name.entry.ejb.usermanager.UserManagerHome</home> 
     <remote>what should go here??</remote> 
</ejb-ref> 

下面的Java代碼是給我的NamingException 。我的意思是.WAR部署在服務器上(Sun Application Server)。

堆棧跟蹤(後jsight的建議):

>Exception occurred in target VM: com.sun.enterprise.naming.java.javaURLContext.<init>(Ljava/util/Hashtable;Lcom/sun/enterprise/naming/NamingManagerImpl;)V 
java.lang.NoSuchMethodError: com.sun.enterprise.naming.java.javaURLContext.<init>(Ljava/util/Hashtable;Lcom/sun/enterprise/naming/NamingManagerImpl;)V 
at com.sun.enterprise.naming.java.javaURLContextFactory.getObjectInstance(javaURLContextFactory.java:32) 
at javax.naming.spi.NamingManager.getURLObject(NamingManager.java:584) 
at javax.naming.spi.NamingManager.getURLContext(NamingManager.java:533) 
at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:279) 
at javax.naming.InitialContext.lookup(InitialContext.java:351) 
at gov.hud.pih.eiv.web.EjbClient.EjbClient.getUserManager(EjbClient.java:34) 
+0

你能提供一個堆棧跟蹤?代碼是在容器的外部還是內部執行? – 2009-09-24 20:29:53

+0

請參閱我的編輯 – Drake 2009-09-24 20:46:45

+0

請添加您的部署描述符。 – 2009-09-24 20:54:14

回答

1

也許查找字符串實際上應該是: 「Java的:comp/env的/ EJB/userManagerBean」?

+0

沒有工作:( – Drake 2009-09-24 20:46:19

+2

這聽起來像你現在沒有得到一個命名異常,我建議不要將屬性傳遞給初始上下文,運行在應用服務器內部,你根本不需要這樣做。 – jsight 2009-09-25 16:44:48

1

首先,解決您的web.xml,然後添加遠程它接口:

<ejb-ref> 
    <description>Sample EJB</description> 
    <ejb-ref-name>SampleBean</ejb-ref-name> 
    <ejb-ref-type>Session</ejb-ref-type> 
    <home>com.SampleHome</home> 
    <remote>com.Sample</remote> <!-- the remote interface goes here --> 
</ejb-ref> 

然後,關於java.lang.NoSuchMethodError,肖恩是對的,你有應用程序服務器的版本之間存在不匹配「客戶端庫「您正在使用NetBeans內部版本和應用服務器版本(服務器端)。我無法確切地告訴您需要對齊哪些JAR,請參閱Sun Application Server文檔。

PS:這不是對問題的直接回答,但我認爲當您創建初始上下文並調用System.getProperties()時沒有任何有用的屬性,這些屬性沒有任何幫助定義上下文的環境(例如,初始上下文工廠)。有關更多詳細信息,請參閱InitialContextjavadocs。

1

最後兩個答案都是正確的,他們是你需要改變/修復的東西。但是你看到的NoSuchMethodError不是來自你的代碼,也不是來自試圖找到你的代碼的東西(會產生某種NoClassDefFoundException,我認爲是這種情況)。這看起來更像是容器提供的JNDI提供程序的不兼容版本,以及Java庫中的JNDI實現需要什麼。這是一個非常含糊的答案,但是,可以想象它可以通過升級你的應用服務器來解決,並且確保你沒有在你的應用中部署與JNDI相關的基礎設施類的可能陳舊的副本,這可能會造成干擾。

35

我想你想從Sun應用服務器的Web應用程序訪問EJB應用程序(稱爲EJB模塊),對嗎?

好的,我們走吧。

將EJB部署到應用程序服務器時,應用程序服務器爲其提供一個地址(稱爲全局JNDI地址),作爲您訪問它的一種方式(如您的地址)。它從應用程序服務器更改爲另一個。

在JBoss應用服務器,你可以看到全局JNDI地址在下面的地址

http://127.0.0.1:8080/jmx-console/HtmlAdaptor 

在陽光應用服務器(啓動起來之後),如果你想看到全局JNDI地址(啓動起來後, ),請執行下列操作

訪問管理控制檯中的下列地址

http://127.0.0.1:4848/asadmin 

並點擊JNDI瀏覽

如果EJB沒有被註冊在那裏,有什麼不對的

EJB有兩種形式:EJB 2.1和EJB 3.0。那麼區別是什麼呢 ?

好,好,好......

讓我們開始與EJB 2.1

  1. 創建一個Home接口

它定義了用於創建,銷燬,並尋找本地或遠程方法EJB對象。它充當EJB對象的生命週期接口。所有home接口必須擴展標準接口javax.ejb.EJBHome - 如果使用遠程ejb對象 - 或javax.ejb.EJBLocalHome - 如果使用本地EJB對象。

// a remote EJB object - extends javax.ejb.EJBHome 
// a local EJB object - extends javax.ejb.EJBLocalHome 
public interface MyBeanRemoteHome extends javax.ejb.EJBHome { 

    MyBeanRemote create() throws javax.ejb.CreateException, java.rmi.RemoteException; 

} 

應用服務器將創建Home對象作爲一種獲取EJB對象的方式,而不是其他任何東西。

照顧以下

會話bean的遠程home接口必須定義一個或多個創建<方法>方法。 無狀態會話bean必須定義一個<方法>沒有參數的方法。

...

throws子句必須包括javax.ejb.CreateException

...

如果你的主接口擴展javax.ejb.EJBHome,拋出子句必須包含java.rmi.RemoteException。如果它擴展了javax.ejb.EJBLocalHome,則不得包含java.rmi.RemoteException。

...

每個創建一個狀態會話bean的方法必須被命名爲創建<METHOD>,它 必須匹配的Init方法的一個或的ejbCreate < METHOD在會話 豆類中定義>方法。匹配ejbCreate <方法>方法必須具有相同的自變量和類型的自變量。無狀態會話bean的創建方法必須命名爲create,但不需要有匹配的「ejbCreate」方法。


現在創建一個業務接口,以便在我們的EJB對象定義業務邏輯

// a remote EJB object - extends javax.ejb.EJBObject 
// a local EJB object - extends javax.ejb.EJBLocalObject 
public interface MyBeanRemote extends javax.ejb.EJBObject { 

    void doSomething() throws java.rmi.RemoteException; 

} 

如果您使用的是遠程EJB現在照顧以下

對象,遠程接口方法不能顯示本地接口類型或本地home接口類型。

...

如果你的主接口擴展javax.ejb.EJBObject,拋出子句必須包括java.rmi.RemoteException異常。如果它擴展了javax.ejb.EJBLocalObject,則不能包含java.rmi.RemoteException。現在


我們的EJB

public class MyBean implements javax.ejb.SessionBean { 

    // why create method ? Take a special look at EJB Home details (above) 
    public void create() { 
     System.out.println("create"); 
    } 

    public void doSomething() throws java.rmi.RemoteException { 
     // some code 
    }; 

} 

現在採取以下

它必須實現javax.ejb.SessionBean護理。它定義了四個方法 - 上面沒有顯示:setSessionContext,ejbRemove,ejbPassivate和ejbActivate。

對於接口中定義的每個方法,必須在會話bean類匹配的方法:因爲EJB的規範說

通知我們的豆沒有實現我們的業務接口。匹配方法必須具有:

  • 同名
  • 相同數量和類型的參數,和相同的返回類型。
  • 必須在本地接口的方法的throws子句中定義bean類的會話 的匹配方法的throws子句中定義的所有異常。

而你必須聲明一個ejb-jar。根據

<?xml version="1.0" encoding="UTF-8"?> 
<ejb-jar xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd" version="2.1"> 
    <enterprise-beans> 
     <session> 
      <ejb-name>HelloWorldEJB</ejb-name> 
      <home>br.com.MyBeanRemoteHome</home> 
      <remote>br.com.MyBeanRemote</remote> 
      <local-home>br.com.MyBeanLocalHome</local-home> 
      <local>br.com.MyBeanLocal</local> 
      <ejb-class>br.com.MyBean</ejb-class> 
      <session-type>Stateless</session-type> 
      <transaction-type>Container</transaction-type> 
     </session> 
    </enterprise-beans> 
</ejb-jar> 

如果您沒有本地EJB對象從部署描述符除去上述

<local-home>br.com.MyBeanLocalHome</local-home> 
<local>br.com.MyBeanLocal</local> 

如果沒有遠程EJB對象從部署描述符除去上述

xml文件
<home>br.com.MyBeanRemoteHome</home> 
<remote>br.com.MyBeanRemote</remote> 

,放入META-INF目錄

我們的jar文件w ^生病包含以下

/META-INF/ejb-jar.xml 
br.com.MyBean.class 
br.com.MyBeanRemote.class 
br.com.MyBeanRemoteHome.class 

現在我們的EJB 3.0

// or @Local 
// You can not put @Remote and @Local at the same time 
@Remote 
public interface MyBean { 

    void doSomething(); 

} 

@Stateless 
public class MyBeanStateless implements MyBean { 

    public void doSomething() { 

    } 

} 

閒來無事,

在JBoss中,把jar文件中

<JBOSS_HOME>/server/default/deploy 

在太陽的應用服務器的訪問,以便當你部署在NetBeans應用程序時有一些問題想部署ejb-jar文件

管理控制檯

http://127.0.0.1:4848/asadmin 

並獲得EJB模塊(啓動起來之後)我建議以下

  1. 創建一個簡單的Java庫項目(一個簡單的罐子沒有一個主要方法)
  2. 添加/服務器/默認/ lib目錄(包含爲了你retriev jar文件你e EJB的)jar文件到您的Java應用程序,無論您是使用JBoss(我不知道是哪個目錄在Sun Application Server)的
  3. 實現上述

代碼現在,創建另一個戰爭PROJECT

  1. 添加上面創建的項目並添加<JBOSS_HOME>/client(包含jar文件以訪問我們的EJB)。我再次不知道Sun Application Server中的哪個目錄。刪除它的文檔。
  2. 見如圖答案

,實施您的Servlet或別的東西,下面的代碼的頂部全球映射地址是否正在使用JBoss

public static Context getInitialContext() throws javax.naming.NamingException { 

    Properties p = new Properties(); 
    p.put(Context.INITIAL_CONTEXT_FACTORY,  "org.jnp.interfaces.NamingContextFactory"); 
    p.put(Context.URL_PKG_PREFIXES, " org.jboss.naming:org.jnp.interfaces"); 
    p.put(Context.PROVIDER_URL, "jnp://127.0.0.1:1099"); 

    return new javax.naming.InitialContext(p); 
} 

或下是否你正在使用Sun應用服務器 - 將文件appserv-rt.jar(我不知道哪個過去包含appserv-rt。在classpath的jar孫Application Server)的

public static Context getInitialContext() throws javax.naming.NamingException { 

    return new javax.naming.InitialContext(); 

} 

爲了訪問我們的servlet的EJB或者

MyBeanRemote myBean = (MyBeanRemote) getInitialContext().lookup(<PUT_EJB_GLOBAL_ADDRESS_RIGHT_HERE>); 

myBean.doSomething(); 

方面的東西,

+0

你可以請看看這個問題。 http://stackoverflow.com/questions/29190816/ejb2-javax-naming-namenotfoundexceptionexception-in-lookup – User27854 2015-03-22 05:19:49