Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javaee中使用Morphia_Java_Mongodb_Jakarta Ee_Ejb_Morphia - Fatal编程技术网

在javaee中使用Morphia

在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

我正试图将Morphia用作我使用JavaEE创建的web服务的一部分

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

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

因此,我有一个用@Stateless注释标记的EJB,这样我可以在需要时注入它,它扩展了morhpia提供的基本功能,如下所示:

@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();
}