我想在一个新项目中重用我的AbstractDAO,但这次我不想使用EJB注释 - 只是CDI的。如何将我的DAO Bean从EJB更改为纯CDI?
到目前为止,我一直在使用它像这样:
public abstract class AbstractDAO<T> {
@PersistenceContext(unitName = "myUnit")
private EntityManager entityManager;
private Class<T> entityClass;
public AbstractDAO(Class<T> entityClass) {
this.entityClass = entityClass;
}
protected EntityManager getEntityManager() {
return entityManager;
}
public void save(T entity) {
entityManager.persist(entity);
}
public void update(T entity) {
entityManager.merge(entity);
}
public void remove(T entity) {
entityManager.remove(entityManager.merge(entity));
}
public T findById(Object id) {
return entityManager.find(entityClass, id);
}
public List<T> findBy(String attrName, Object attrValue) {
// Impl here
}
// [...] Many more search methods
}
我一直在创造为每个实体一个DAO,像这样的例子:
@Stateless
public class UserDAO extends AbstractDAO<User> {
public UserDAO() {
super(User.class);
}
public User findByUsername(String username) {
if (username != null) {
return super.findOneBy("username", username.toLowerCase());
}
return null;
}
}
现在我想摆脱@Stateless注释。但是,简单地用一个@RequestScoped更换也不会因为不带参数的非私有构造器的工作的要求JSR-346
我如何修改我的DAO到纯CDI一个?
'UserDAO'有一个无参数的非私有构造函数。而'@ PersistenceContext'将在JEE环境*中用于CDI bean *。我没有得到正确的问题吗?你真的尝试过使用'UserDAO'' @ RequestScoped'吗?错误是什么? –
只是好奇 - 你想通过这样做达到什么目的? –
我发现CDI和EJB bean的混合让很多人感到困惑(至少在我的最后一个项目中)。另外,我读了这个:http://theelitegentleman.blogspot.de/2014/04/daos-as-ejbs-you-are-doing-it-wrong.html – Tim