将@Named,@ Stateful注入@Singleton EJB

时间:2015-12-08 08:58:29

标签: java dependency-injection ejb entitymanager

有没有办法将@Named bean注入Singleton?

这是需要注入的课程

@Named
@Stateful
@ConversationScoped
public class PlaySessionBean implements Serializable {
    @PersistenceContext(unitName = "test-persistence-unit", type = PersistenceContextType.EXTENDED)
    private EntityManager entityManager;
....
}

bean用于视图实用程序(由Forge生成)

问题是我需要从@Startup @Singleton

访问PlaySessionBean
@Startup
@Singleton
public class StartupBean {
  private static final Logger LOGGER = Logger.getLogger(StartupBean.class.getName());

  private EntityManager entityManager;
  private static EntityManagerFactory factory =
      Persistence.createEntityManagerFactory("wish-to-paris-persistence-unit");
  private List<PlaySession> playSessions;

  @PostConstruct
  public void run() {
    this.entityManager = factory.createEntityManager();
    CriteriaQuery<PlaySession> criteria =
        this.entityManager.getCriteriaBuilder().createQuery(PlaySession.class);
    this.playSessions =
        this.entityManager.createQuery(criteria.select(criteria.from(PlaySession.class)))
            .getResultList();
    this.entityManager.close();
  }
 ....

但它总是失败并抱怨PlaySession不是实体

有没有办法将命名有状态bean注入Singleton? 如果没有,是否有任何解决方法?

由于

1 个答案:

答案 0 :(得分:1)

您正在将CDI范围与EJB状态混合使用。我宁愿您选择CDI或EJB但不要混合使用2.首先,两种体系结构之间的事务管理是不同的。此外,每个对象的生命周期完全不同。

如果您打算使用EJB并调用相应的会话bean,您可以将@Stateful会话Bean注释为@LocalBean,因为您的会话bean没有接口继承。

示例:

@Stateful
@LocalBean
public class PlaySessionBean implements Serializable {

}

然后在@Startup Singleton bean上,您可以通过以下方式引用它:

@EJB
private PlaySessionBean playSessionBean;

EJB会话Bean仍然是有状态的。