我遇到了从测试源中的EntityManager
向主源中的服务注入Producer
的问题。目的是将此库嵌入到另一个项目中,项目将使用它自己的Producer
unitName定义PersistenceContext
。如果我在主要来源中没有制作人,则会出现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>
参数但没有成功。
还有其他办法吗?
我的环境
修改
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");
答案 0 :(得分:0)
嗯,我根本没有看到问题^^
你有吗? 的src /测试/资源/ META-INF / beans.xml文件?您的测试结果如何? Arquillian,还是手动启动容器? 你是否在类路径中使用带有MY_PU PersistenceUnit的persistence.xml?我可以查看示例项目的任何github吗?
我需要更多关于您的环境的信息来帮助您...
答案 1 :(得分:0)
我们遇到了类似的问题,并降级为Maven 3.0.5。
问题似乎在this Glassfish JIRA中讨论过了。我似乎无法找到讨论中提到的Maven JIRA。我仍然在寻找一种方法来使用嵌入式Glassfish的最新Maven,但运气不佳。
答案 2 :(得分:0)
E!我忘记了这篇文章。感谢所有提供意见的人。 IIRC,我们最终放弃了使用Arquillian的嵌入式容器,转而使用外部GF容器。当时,我认为我们觉得它提供了一个更现实的测试环境,并且避免了嵌入式容器的类加载问题。