在javaee中使用Morphia
我正试图将Morphia用作我使用JavaEE创建的web服务的一部分 我阅读了有关其DAO支持的morphia文档,其中说: 在web应用程序环境中,我们可能会使用依赖项注入框架(如Guice或Spring)将依赖项注入DAO,然后将DAO注入控制器,因此控制器永远不会直接处理繁琐的细节 因此,我有一个用@Stateless注释标记的EJB,这样我可以在需要时注入它,它扩展了morhpia提供的基本功能,如下所示:在javaee中使用Morphia,java,mongodb,jakarta-ee,ejb,morphia,Java,Mongodb,Jakarta Ee,Ejb,Morphia,我正试图将Morphia用作我使用JavaEE创建的web服务的一部分 我阅读了有关其DAO支持的morphia文档,其中说: 在web应用程序环境中,我们可能会使用依赖项注入框架(如Guice或Spring)将依赖项注入DAO,然后将DAO注入控制器,因此控制器永远不会直接处理繁琐的细节 因此,我有一个用@Stateless注释标记的EJB,这样我可以在需要时注入它,它扩展了morhpia提供的基本功能,如下所示: @Stateless public class PlayerDAO exten
@Stateless
public class PlayerDAO extends BasicDAO<Player, ObjectId>{
@EJB
ConnectionFactory factory;
public PlayerDAO(){};
public PlayerDAO(Morphia morphia, MongoClient mongo){
super(mongo, morphia, "testdb");
}
}
我的问题是,我需要提供接受Morphia和MongoClient参数并调用超级构造函数的构造函数,这意味着我还需要提供一个无参数构造函数来满足JavaEE的要求
添加此构造函数时,NetBeans显示错误:
公共玩家道{};
构造函数BasicDAO.BasicDAO数据存储不适用
实际参数列表和形式参数列表的长度不同
构造函数BasicDAO.BasicDAOMongoClient、Morphia、String不适用
实际参数列表和形式参数列表的长度不同
构造函数BasicDAO.BasicDAO类,数据存储不适用
实际参数列表和形式参数列表的长度不同
构造函数BasicDAO.BasicDAO类、MongoClient、Morphia、String不适用
实际参数列表和形式参数列表的长度不同
有没有一种方法可以避免这种行为,或者我应该采取另一种方法来将MongoDB用作JavaEEWeb服务的一部分?这就是我们所做的,非常有效。下面的实现只是部署到Tomcat的CDI,但也可以使用@Stateless bean。我们让Mongo和Morphia由工厂生产。@QConfig注释名称由生产者生成,生产者从包含MongoDB数据库名称的类路径中读取.properties文件
public interface EntityDao<T, K> {
T findById(K id);
K save(T object);
T update(T object); // returns an up-to-date version of the entity
}
public class BaseDaoMorphiaImpl<T extends BaseEntity, K>
implements EntityDao<T, K>, Serializable {
@Inject
private @QConfig String mongoDbName;
@Inject
private @QMongo Instance<Mongo> mongo;
@Inject
private @QMorphia Instance<Morphia> morphia;
// BasicDAO is not serializeable; always use wrapper getBasicDao()
private transient BasicDAO<T, K> basicDao;
private Class clazz;
public BaseDaoMorphiaImpl(Class clazz) {
this.clazz = clazz;
}
@PostConstruct
public void init() {
setupBasicDao();
}
protected BasicDAO<T, K> getBasicDao() {
if (basicDao == null)
setupBasicDao();
return basicDao;
}
private void setupBasicDao() {
basicDao = new BasicDAO<T, K>(clazz, mongo.get(), morphia.get(), mongoDbName);
basicDao.ensureIndexes();
}
@Override
public T findById(K id) {
return getBasicDao().get(id);
}
@Override
public K save(T o) {
Key<T> key = getBasicDao().save(o);
return (K) key.getId();
}
@Override
public T update(T o) {
return findById((K) o.getId());
}
protected QueryResults<T> find( Query<T> query ) {
return getBasicDao().find(query);
}
protected T findOne( Query<T> query ) {
return getBasicDao().findOne(query);
}
protected Query<T> createQuery() {
return getBasicDao().getDatastore().createQuery(clazz);
}
}
例如:
public interface UserDao extends EntityDao<User, ObjectId> {
User findByEmail( String email );
User findByName( String name );
List<User> findAll();
}
public class UserDaoMorphiaImpl extends BaseDaoMorphiaImpl<User, ObjectId> implements UserDao {
@Inject
private Logger logger;
public UserDaoMorphiaImpl() {
super(User.class);
}
@Override
public User findByEmail(String email) {
Datastore ds = getBasicDao().getDatastore();
User res = ds.find(User.class).filter("email = ", email).get();
return res;
}
@Override
public User findByName(String name) {
Datastore ds = getBasicDao().getDatastore();
User res = ds.find(User.class).filter("name = ", name).get();
return res;
}
@Override
public List<User> findAll() {
return getBasicDao().find().asList();
}
@Override
public ObjectId save(User user) {
return super.save(user);
}
}
对于更具体的查询,可以使用以下内容:
@Override
public Iterator<Document> fetchNewest( int start, int count ) {
return find(createQuery().order("-uploadDate").offset(start).limit(count)).iterator();
}