![](/img/trans.png)
[英]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.