繁体   English   中英

在Java EE中使用Morphia

[英]Using Morphia with Java EE

我试图将Morphia用作使用Java EE创建的Web服务的一部分。

我阅读了有关其DAO支持的morphia文档,其中说:

在Web应用程序环境中,我们可能会使用依赖项注入框架(例如Guice或Spring)将依赖项注入到DAO中,然后将DAO注入到控制器中,因此控制器将永远不会直接处理具体细节。

因此,我有一个标有@Stateless批注的EJB(以便可以在需要时进行注入),它扩展了BasicDAO morhpia提供的内容,如下所示:

@Stateless
public class PlayerDAO extends BasicDAO<Player, ObjectId>{

    @EJB
    ConnectionFactory factory;

    public PlayerDAO(){};

    public PlayerDAO(Morphia morphia, MongoClient mongo){
    super(mongo, morphia, "testdb");
    }
}

我的问题是我需要提供MorphiaMongoClient参数并调用super构造函数的构造函数,这意味着我还需要提供无参数的构造函数来满足Java EE的要求。

当我添加此构造函数时,NetBeans显示错误:

public PlayerDAO(){};
构造函数BasicDAO.BasicDAO(Datastore)不适用
(实际和正式论点列表的长度不同)
构造函数BasicDAO.BasicDAO(MongoClient,Morphia,String)不适用
(实际和正式论点列表的长度不同)
构造函数BasicDAO.BasicDAO(Class,Datastore)不适用
(实际和正式论点列表的长度不同)
构造函数BasicDAO.BasicDAO(Class,MongoClient,Morphia,String)不适用
(实际和正式论点列表的长度不同)

有没有一种方法可以解决此问题,还是应该采用其他方法才能将MongoDB用作Java ee Web服务的一部分?

这就是我们所做的,效果很好。 下面的实现仅是CDI(部署到Tomcat),但也可用于@Stateless bean。 我们让MongoMorphia@Produce d由工厂。 @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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM