[英]How to prevent no sql injetion when using Morphia with java ee?
[英]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");
}
}
我的問題是我需要提供Morphia
和MongoClient
參數並調用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。 我們讓Mongo
和Morphia
是@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.