在没有容器的情况下解析EJB依赖项

时间:2012-08-31 08:21:50

标签: java reflection dependency-injection ejb

我目前正致力于使用JUnit测试EJB 3服务的解决方案。 (是的,我查看了ejb3unit,但它对我不起作用。是的,我已经看过openEJB的容器集成测试,但这两个测试都没有用。)

所以我的问题是解决@EJB注释依赖关系的方法是什么?我并不是说使用像Weld,Guice或Spring这样的DI框架。该解决方案应适用于普通的旧JUnit测试 - >不使用像JBoss,Glassfish或openEJB这样的EJB容器。

我能够通过@PersistenceContext使用java反射来替换实体管理器的注入。那么如何使用@EJB注释来实现依赖关系呢?

(我不介意自己构建和解析依赖树,只是寻找想法;))

来自德国的问候, P.S。

3 个答案:

答案 0 :(得分:2)

不确定为什么你反对你提出的解决方案。
我准备提供像Arquillian这样的东西,但是嘿 - 你不想让一个容器参与其中。
我只是想确定你不想要容器的原因,然后再继续讨论一些想法(虽然我没有测试它们) -
使用JBoss AS 7.x,企业应用程序服务器的部署时间大大减少, 更不用说使用Arquillian你有一个部署API,你可以决定你将部署什么(即 - 部署,例如只为给定测试的一个bean)。
但是,我确实尊重你的问题,所以这里有一些想法 -
A.你提到你设法使用反射注入一个EntityManager - 你是怎么做到的?
为什么不在豆子上涂上相同的东西?

B.如果您遇到A问题,为什么不基于cglib开发自己的注入代码(为了创建代理不仅仅用于接口,还用于类)。
这样,当创建类的对象时,
您将能够截取默认的CTOR,并扫描用@Ejb注释的字段。
我建议使用某种配置文件,为每个bean接口映射如何实例化一个合适的类,并重新运行这个流(因为注入的bean可能还有一个带有@EJB注释的字段)。

注意,如果你决定使用这种工作方法,你将实现某种“迷你依赖注入框架” - 除了个人我有兴趣看到你的代码(:))我认为你应该仔细想想为什么你不想使用“已经解决的问题。”

答案 1 :(得分:1)

关于Arquillian建议的注意事项,仍然需要像JBoss,GlassFish或OpenEJB这样的EJB容器。

如果问题只是查找并包含所有依赖项,请尝试使用包含EJB Lite所需的所有依赖项的jar:

http://repo1.maven.org/maven2/org/apache/openejb/openejb-lite/4.0.0/openejb-lite-4.0.0.jar

在测试类路径中包含(不需要其他jar),然后只需启动嵌入式容器:

EJBContainer container = EJBContainer.createEJBContainer();
MyBean bean = (MyBean) container.getContext().lookup("java:global/myModleName/MyBean");

工作示例here

答案 2 :(得分:0)

你看过Arquillian吗? 您可以在项目页面上找到所有文档:http://www.jboss.org/arquillian.html