@用CDI注入一个Morphia DAO?

时间:2013-10-01 00:41:51

标签: mongodb java-ee cdi morphia inject

我正在编写一个Java EE 6应用程序,它利用Morphia将对象持久化到MongoDB。我希望能够在必要时@Inject我的DAO类,所以我创建了一个适当实例化DAO的Factory类。它看起来像这样:

public class MyDAOFactory {

    @Inject
    private Datastore mongoDatastore = null;

    /**
     * Creates the DAO
     */
    @Produces
    @ApplicationScoped
    public MyDAO createDAO() {
        MyDAO dao = new MyDAO(
                this.mongoDatastore);
        return dao;
    }
}

代码编译很好,但是当我在JBoss EAP 6.1上运行我的应用程序时,它会抱怨因为MyDAO没有no-arg构造函数。我会添加一个,但Morphia BasicDAO类也没有,所以我不知道它会这样工作。

有没有办法将@Inject DAO实例导入我的EJB,Servlet等?或者我是否每次都需要手动实例化它?

1 个答案:

答案 0 :(得分:2)

由于某些原因,CDI似乎需要MyDAO的no-arg构造函数。也许是因为你如何使用这个bean(出于可能的原因,请参阅规范ch.5.4“客户端代理”)。

不能创建一个默认构造函数,因为基类没有一个,而且我从code看到的super构造函数可以立即使用它们ARGS。因此,从no-arg构造函数向super()传递null将导致错误。

我的建议是创建一个界面(可选择扩展org.mongodb.morphia.dao.DAO),例如MyDAOInterface具有MyDAO的所有公共业务方法。然后修改MyDAO以实现此接口并将生产者更改为返回MyDAOInterface

public interface MyDAOInterface extends DAO {...}

public class MyDAO implements MyDAOInterface {
    // same implementation
}

public class MyDAOFactory {
    @Inject
    private Datastore mongoDatastore = null;

    /**
     * Creates the DAO
     */
    @Produces
    @ApplicationScoped
    public MyDAOInterface createDAO() {
        MyDAO dao = new MyDAO(this.mongoDatastore);
        return dao;
    }
}

顺便说一下,对接口进行编程有额外的好处,可以让你的代码更容易测试,所以值得轻微麻烦。