我遇到了将EntityManager
从测试源中的Producer
注入到主源中的服务的问题。其目的是将此库嵌入到另一个项目中,在该项目中,该项目将使用自己的PersistenceContext
单元名称定义Producer
。如果我在主要来源中没有Producer,我会得到Caused by: java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName MY_PU
错误。
例如:
/** src/main/java/org/sample/service */
@Stateless
public class MyBean {
@Inject
@MyCustomQualifier
private EntityManager em;
}
/** src/test/java/org/sample/service */
public class EntityManagerProducer {
@Produces
@MyCustomQualifier
@PersistenceContext(unitName = "MY_PU")
private EntityManager em;
}
为了测试服务,我必须使用maven ant插件将*.class文件移动到target/classes
目录,并在包阶段之前将其删除。这行得通,但太草率了。我尝试过更改surefire插件中的<useSystemClassLoader>
和<useManifestOnlyJar>
参数,但没有成功。
还有别的办法吗?
我的环境
- Maven:2.2.1
- Surefire:2.4.2
- 玻璃鱼嵌入所有:3.1.1
编辑
beans.xml同时存在于(test/main)/resources/META-INF 中
我按如下方式启动GF容器。
Map<String, Object> properties = new HashMap<String, Object>();
properties.put(EJBContainer.MODULES, new File[]{new File("target/classes"), new File("target/test-classes")});
EJBContainer ejbContainer = EJBContainer.createEJBContainer(properties);
Context ctx = ejbContainer.getContext();
MyBean service = ctx.lookup("java:global/ejb-app/classes/MyBean");
我根本看不出问题^^
你有src/test/resources/META-INF/beans.xml?
你的测试看起来怎么样?Arquillian,还是手动启动容器?类路径中有带有MY_PU PersistenceUnit的persistence.xml吗?我可以在任何github左右的地方查看示例项目?
我需要更多关于你的环境的信息来帮助你。。。
我们遇到了类似的问题,并降级到Maven 3.0.5。
这个问题似乎在本次Glassfish JIRA中进行了讨论。我似乎找不到讨论中提到的Maven JIRA。我仍在寻找一种方法来使用嵌入Glassfish的最新Maven,但运气不太好。
Eeesh!我忘记了这篇文章。感谢所有提供意见的人。IIRC,我们最终放弃了嵌入式容器,转而使用Arquillian的外部GF容器。当时,我认为我们觉得它提供了一个更现实的测试环境,并避免了嵌入式容器的类加载问题。