2010-03-08 62 views
3

我正在使用針測試API測試Seam應用程序。在我的代碼中,我使用EntityHome的getEntityManager()方法。當我在內存數據庫運行單元測試針對我得到以下異常:在Seam中從EntityHome注入EntityManager和getEntityManager之間有什麼區別

java.lang.IllegalStateException: No application context active 
at org.jboss.seam.Component.forName(Component.java:1945) 
at org.jboss.seam.Component.getInstance(Component.java:2005) 
at org.jboss.seam.Component.getInstance(Component.java:1983) 
at org.jboss.seam.Component.getInstance(Component.java:1977) 
at org.jboss.seam.Component.getInstance(Component.java:1972) 
at org.jboss.seam.framework.Controller.getComponentInstance(Controller.java:272) 
at org.jboss.seam.framework.PersistenceController.getPersistenceContext(PersistenceController.java:20) 
at org.jboss.seam.framework.EntityHome.getEntityManager(EntityHome.java:177) 
etc .. 

我可以用

@In 
EntityManager entityManager; 

注入的EntityManager解決一些錯誤不幸的是,持續的EntityHome方法還請撥打getEntityManager。這意味着很多嘲弄或以某種方式重寫代碼。有沒有解決方法,爲什麼拋出這個異常呢?順便說一下,我使用Seam 2.2.0 GA。

組件沒有什麼特別之處。它們由seam-gen產生。測試是在內存數據庫中執行的 - 我遵循http://jbosscc-needle.sourceforge.net/jbosscc-needle/1.0/db-util.html中的示例。

回答

4

在Seam中有什麼區別從EntityHome注入EntityManager和getEntityManager

沒有人。

從EntityHome使用getEntityManager時,Seam將查找名爲entityManager的Seam管理的持久性上下文。如果您使用除entityManager之外的其他名稱來設置您的Seam管理的持久性上下文,那麼您的EntityHome會拋出Excedption。

這裏是getEntityMananger的EntityHome

public EntityManager getEntityManager() { 
    return (EntityMananger) Component.getInstance("entityManager"); 
} 

的默認實現,並使用@時,在-遭離棄的EntityManager,Seam會如上圖所示做。兩者都是相同的Seam管理持久性上下文。

記住Seam通過@ In -jected Component字段名稱執行查找。例如:

@In 
EntityManager entityManager; 

由於EntityManager的字段名稱爲的EntityManager,Seam會用這個名字進行分層搜索;

Herehere您可以看到如何設置Seam Managed Persistence上下文。

關於,

相關問題