2010-10-14 90 views
4

此問題是關於Java EE 6,使用glassfish v3 embedded-allJava EE 6 - 嵌入式容器EJB測試

我有一個使用的EJBContainer來測試我的無狀態EJB單元測試。

setup() { 

    ctx = EJBContainer.createEJBContainer().getContext(); 

} 

... 

test() { 

BookService bookService = (BookService)ctx.lookup("java:global/BookServiceEJB!com.something.service.BookService"); 

... 

} 

@Stateless 
public class BookServiceEJB implements BookService { 
... 
} 

@Remote 
public interface BookService { 
... 
} 

給出了異常:

javax.naming.NamingException: Lookup failed for 'java:global/BookServiceEJB!com.something.service.BookService' in SerialContext [Root exception is javax.naming.NameNotFoundException: BookServiceEJB!com.something.service.BookService not found] 

... 

caused by: javax.naming.NameNotFoundException: BookServiceEJB!com.something.service.BookService not found 

我嘗試了好幾種JNDI資源路徑:

例如問題是我使用JNDI有擡頭的EJB(遠程)麻煩

java:global/BookServiceEJB 

java:global/BookService 

連:

java:global/BookShelf-1.0-SNAPSHOT/BookServiceEJB 

等等

空話工作

沒有任何XML部署配置文件,只有persistence.xml在META-INF。

測試是萬無一失的使用maven:

mvn clean test 

任何幫助,不勝感激!

注意:全部署到GlassFish服務器的作品(使用appclient和@EJB注射)

+0

注意:對Glassfish服務器的全面部署工作(使用appclient和@EJB注入) – Dzhu 2010-10-14 23:26:36

回答

6

一番搜索後,發現對我的作品你必須解決...

使用以下屬性配置EJBContainer:EJBContainer.MODULES,以及模塊類的位置(如果使用maven,'target/classes')。

例如

... 
props = new Properties(); 
props.put(EJBContainer.MODULES, new File("target/classes")); 
ec = EJBContainer.createEJBContainer(props); 
... 

如果你的EJB使用JPA,那裏有另一個問題,您將無法定義嵌入式容器中的數據源,所以必須使用默認的DS:「爲jdbc/__默認」。

因此,例如,我的persistence.xml看起來像這樣:

<?xml version="1.0" encoding="UTF-8"?> 

<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
    version="1.0"> 

    <persistence-unit name="bookshelf" transaction-type="JTA"> 
     <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
     <class>com.blah.domain.Book</class> 
     <jta-data-source>jdbc/__default</jta-data-source> 
     <properties> 
      <property name="eclipselink.logging.level" value="INFO"/> 
     </properties> 
    </persistence-unit> 

</persistence> 

我還沒有想出如何配置嵌入式容器測試使用一個DS(JDBC/__默認設置),我的應用程序使用另一個(例如JDBC/booksDS)

看到http://www.mentby.com/glassfish/embedded-testing-woes.html

看到http://forums.java.net/jive/thread.jspa?messageID=395759

說實話,我不知道爲什麼人們都與Java EE困擾時,像春天的解決方案是如此簡單得多......

它一直非常令人沮喪,浪費了很多時間......希望這會有所幫助。

+0

此外,JNDI名稱格式爲:'java:global/classes/EJBClass!com.fully.qualified.remote。 EJBRemoteInterface' - 即jndi字符串中沒有應用程序/模塊組件。 – Dzhu 2010-10-16 01:56:46

+0

在persistence.xml中定義jta-data-source後,我也收到錯誤... 內部異常:java.sql.SQLException:分配連接時出錯。原因:無法分配連接,因爲:java.net.ConnectException:連接到端口1527上的服務器本地主機時出現Connection refused:連接錯誤。 錯誤代碼:0 \t at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:309) – 2011-01-24 10:50:45

3

檢查出來有需要,以確保您可以通過context.lookup避免的NamingException載入bean來檢查的幾個項目。

  1. 確保你有一個bean。這可能聽起來很明顯,但我花了很多時間試圖弄清楚爲什麼我無法在測試中獲得我的服務實例。原因是我錯過了無狀態註釋。

  2. 當@Dzhu指出創建容器時添加模塊。對於行家目標/ ,對於行家測試目標/ 測試類

  3. 如果在控制檯中發現諸如SEVERE: EJB6005:No EJB modules found的消息,則會出現問題。它告訴你,沒有無狀態帶註釋的類

  4. 看看嵌入式glassfish控制檯!在那裏你會看到你的bean的查找名稱。請注意格式爲INFO: EJB5181:Portable JNDI names for EJB YourBean: [java:global/classes/YourBean!bean.package.YourBean, java:global/classes/YourBean]的消息。這意味着您可以通過調用context.lookup("java:global/classes/YourBean!bean.package.YourBean")或更短的名稱context.lookup("java:global/classes/YourBean")來查找您的bean,如果沒有名稱衝突,這可能很有用。

希望這可以幫助別人。有這個提示會很有幫助。