如何在没有 setter 方法的情况下将注入 statelesbean 的实体管理器传递给 dao

How to pass entity manager injected in statelesbean to dao without setter method

我正在做一个项目,在这个项目中我将 EJB 分开,这样它们只执行业务逻辑而不执行查询。然后我还有执行查询的 DAO。为了使用 DAO,我将 DAO 注入到 EJB 中,并使用注释为@PostConstruct 的方法,我在 DAO 中设置了 EntityManager,并将 EntityManager 注入到 bean 中,如下所示:

public class ClazzDao implements ClazzDaoI{

  private EntityManager em;

  public void setEm(EntityManager em){
     this.em = em;
  }

  public List<Entity> list(){
      return em.createQuery("FROM Entity e").getResultList();
  }

}

和 EJB

@Stateless    
public class ClazzBean implements ClazzBeanI{
  @PersistenceContext
  private EntityManager em;

  @Inject
  private ClazzDaoI clazzDao;

  @PostConstruct
  private void init(){
    clazzDao.setEm(em);
  }

  public BigDecimal sendEmailToMembers(){

     List<Entity> members = clazzDao.list();
     //do some stuff with data like say send emails...

  }

}

有没有一种方法可以让 DAO 使用注入到 EJB 中的实体管理器,而无需在 EJB 的 @PostConstruct 中设置它?

您只能在容器管理的 bean 中使用注入功能。 You dao class 在容器管理之外无法将 EntityManager 注入到此对象中。如果您需要注入功能,请将您 class 放入容器管理 (EJB/CDI)。顺便避免使用不必要的接口 use non interface view instead.

确保您使用的是 JAVA EE 6 或更高版本,将 ClazzDao 作为托管 Bean,意味着 @ApplicationScoped/@SessionScoped

@ApplicationScoped public class ClazzDao 实现 ClazzDaoI

CDI 可以注入 ClazzDao ManagedBean。