【问题标题】:Using Morphia with Java EE在 Java EE 中使用 Morphia
【发布时间】:2014-09-30 14:41:41
【问题描述】:

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

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

在 web 应用环境中,我们可能会使用依赖注入框架(如 Guice 或 Spring)将依赖注入到 DAO 中,然后将 DAO 注入到控制器中,因此控制器永远不会直接处理 gritty详情。

因此,我有一个标有 @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 显示错误:

公共 PlayerDAO(){};
构造函数 BasicDAO.BasicDAO(Datastore) 不适用
(实际参数列表和形式参数列表的长度不同)
构造函数 BasicDAO.BasicDAO(MongoClient,Morphia,String) 不适用
(实际参数列表和形式参数列表的长度不同)
构造函数 BasicDAO.BasicDAO(Class,Datastore) 不适用
(实际参数列表和形式参数列表的长度不同)
构造函数 BasicDAO.BasicDAO(Class,MongoClient,Morphia,String) 不适用
(实际参数列表和形式参数列表的长度不同)

有没有办法绕过这种行为,或者我应该采取不同的方法来将 MongoDB 用作 java ee Web 服务的一部分?

【问题讨论】:

    标签: java mongodb jakarta-ee ejb morphia


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-17
      • 1970-01-01
      • 2012-10-19
      • 2022-10-18
      • 1970-01-01
      • 2020-01-14
      • 2014-08-29
      • 1970-01-01
      相关资源
      最近更新 更多