注入 @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 仍然是有状态的。