有没有办法将@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? 如果没有,是否有任何解决方法?
由于
答案 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仍然是有状态的。