注入 @Named , @Stateful 到 @Singleton EJB
Inject @Named , @Stateful to @Singleton EJB
有什么方法可以将@Named bean注入到Singleton中吗?
这里是需要注入的class
@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不是实体
有没有办法将 Named Stateful bean 注入到 Singleton 中?
如果没有,是否有任何解决方法?
谢谢
您将 CDI 作用域与 EJB 状态混合在一起。我宁愿您选择 CDI 或 EJB 而不是混合使用这两种架构。首先,这两种架构之间的事务管理是不同的。还有,每个对象的生命周期是完全不同的。
如果您打算使用 EJB 并调用相应的会话 bean,您可以将 @Stateful
会话 Bean 注释为 @LocalBean
,因为您的会话 bean 没有接口继承。
示例:
@Stateful
@LocalBean
public class PlaySessionBean implements Serializable {
}
然后在您的 @Startup
单例 bean 上,您可以通过以下方式简单地引用它:
@EJB
private PlaySessionBean playSessionBean;
EJB 会话 Bean 仍然是有状态的。
有什么方法可以将@Named bean注入到Singleton中吗?
这里是需要注入的class
@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不是实体
有没有办法将 Named Stateful bean 注入到 Singleton 中? 如果没有,是否有任何解决方法?
谢谢
您将 CDI 作用域与 EJB 状态混合在一起。我宁愿您选择 CDI 或 EJB 而不是混合使用这两种架构。首先,这两种架构之间的事务管理是不同的。还有,每个对象的生命周期是完全不同的。
如果您打算使用 EJB 并调用相应的会话 bean,您可以将 @Stateful
会话 Bean 注释为 @LocalBean
,因为您的会话 bean 没有接口继承。
示例:
@Stateful
@LocalBean
public class PlaySessionBean implements Serializable {
}
然后在您的 @Startup
单例 bean 上,您可以通过以下方式简单地引用它:
@EJB
private PlaySessionBean playSessionBean;
EJB 会话 Bean 仍然是有状态的。