簡體   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