2014-09-30 3 views
1

Java EE를 사용하여 작성중인 웹 서비스의 일부로 Morphia를 사용하려고합니다. BasicDAO morhpia가 제공하는 확장 (내가 그것을 필요로 할 때 삽입 할 수 있도록)Java EE에서 Morphia 사용

In a web application environment, we would probably use a dependency injection framework (like Guice or Spring) to inject the dependencies into the DAO, and then inject the DAO into a controller, so the controller would never directly deal with the gritty details.

그러므로 내가 EJB가 @Stateless 주석으로 표시 한 :

나는 말했다 자신의 DAO 지원에 대한 모르핀 설명서를 읽어

@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 C를 호출하여 다음과 같이 따라서 Java EE의 요구 사항을 충족시키기 위해 args가없는 생성자를 제공해야한다는 것을 의미합니다.

public PlayerDAO(){};
constructor BasicDAO.BasicDAO(Datastore) is not applicable
(actual and formal argument lists differ in length)
constructor BasicDAO.BasicDAO(MongoClient,Morphia,String) is not applicable
(actual and formal argument lists differ in length)
constructor BasicDAO.BasicDAO(Class,Datastore) is not applicable
(actual and formal argument lists differ in length)
constructor BasicDAO.BasicDAO(Class,MongoClient,Morphia,String) is not applicable
(actual and formal argument lists differ in length)

이 문제를 해결 얻을 수있는 방법이 있나요, 아니면 제가 자바 EE의 일환으로 MongoDB를를 사용하기 위해 다른 접근 방식을 복용해야합니다

나는이 생성자 넷빈즈를 추가

오류를 보여줍니다 웹 서비스?

답변

0

이것은 우리가 한 일입니다. 아래의 구현은 CDI 전용 (Tomcat에 배포)이지만 @Stateless 빈과도 작동합니다. 공장에서 MongoMorphia@Produce으로 설정합니다. @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); 
    } 
} 

예 :

@Override 
public Iterator<Document> fetchNewest(int start, int count) { 
    return find(createQuery().order("-uploadDate").offset(start).limit(count)).iterator(); 
} 
:보다 구체적인 쿼리의

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

, 다음과 같이 사용할 수 있습니다