我正在使用针测试API测试Seam应用程序。在我的代码中,我使用EntityHome中的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 ..
我可以通过使用
注入EntityManager来解决其中一些错误@In
EntityManager entityManager;
不幸的是EntityHome
的持久方法也会调用getEntityManager
。这意味着很多模拟或以某种方式重写代码。是否有任何解决方法,为什么抛出此异常?我顺便使用Seam 2.2.0 GA。
组件没有什么特别之处。它们是由seam-gen生成的。测试在内存数据库中执行 - 我按照http://jbosscc-needle.sourceforge.net/jbosscc-needle/1.0/db-util.html中的示例进行了操作。
答案 0 :(得分:4)
在Seam中,从EntityHome 注入的EntityManager和getEntityManager之间有什么区别?
没有人。
当使用来自EntityHome的getEntityManager时,Seam将查找名为 entityManager 的Seam管理的持久化上下文。如果您使用其他名称而不是entityManager 设置Seam管理的持久性上下文,则您的EntityHome将抛出一个Excedption。
以下是EntityHome中的getEntityMananger的默认实现
public EntityManager getEntityManager() {
return (EntityMananger) Component.getInstance("entityManager");
}
当使用@In-jected EntityManager时,Seam将如上所示。两者都是相同的Seam托管持久化上下文。
记住Seam通过@Intrjected组件字段名称执行查找。例如:
@In
EntityManager entityManager;
因为EntityManager字段名称是 entityManager ,Seam将使用此名称执行分层搜索;
Here和here您可以看到如何设置Seam Managed Persistence上下文。
的问候,