我正在编写一个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等?或者我是否每次都需要手动实例化它?
答案 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;
}
}
顺便说一下,对接口进行编程有额外的好处,可以让你的代码更容易测试,所以值得轻微麻烦。