1

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

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没有无参数的构造函数。我会添加一个,但 Morphia BasicDAO 类也没有,所以我不知道它会以这种方式工作。

有没有办法将@InjectDAO 实例放入我的 EJB、Servlet 等?还是我每次都需要手动实例化它?

4

1 回答 1

2

MyDAO出于某种原因,CDI 似乎需要无参数构造函数。可能是因为你使用这个 bean 的方式(可能的原因请参见规范 ch.5.4 “Client Proxies”)。

不能创建默认构造函数,因为基类没有,并且从我从代码中看到的super构造函数立即使用它们的参数。因此,将 nullsuper()从无参数构造函数传递给将引发错误。

我的建议是创建一个接口(可选扩展org.mongodb.morphia.dao.DAO),例如MyDAOInterface,它具有所有公共业务方法MyDAO。然后修改MyDAO以实现此接口并将您的生产者更改为 return 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;
    }
}

顺便说一句,对接口进行编程还有一个额外的好处,那就是让你的代码更易于测试,所以小麻烦是值得的。

于 2013-10-01T14:55:07.650 回答