【问题标题】:How can CDI be called after the user class has been instantiated?用户类实例化后如何调用 CDI?
【发布时间】:2016-05-24 23:29:24
【问题描述】:

我有一个如下所示的课程:

@Named
public class TableView {

    @PersistenceContext protected EntityManager   em;
    @Resource           protected UserTransaction utx;

当然,我可以像这样在构建我的 bean 期间获得一个实例:

@Inject private TableView view;

我相信是 CDI 负责填写 EntityManagerUserTransaction。但是,在我的用户类被实例化后,我有时想要另一个 TableView 实例,那么我该如何获得它呢?很明显

TableView anotherView = new TableView();

不起作用,因为 emutx 将为空。那么如何通过执行的注入获得一个新的工作实例呢?

【问题讨论】:

  • 此链接可能会解决您的问题.. stackoverflow.com/questions/25153624/…
  • @Ankit 这很有趣,但并不完全做到这一点。我正在寻找一个运行时 API 来实例化 bean。
  • 接口Instance和方法get()Instance<TableView> tableViewInstance; TableView newInstance = tableViewInstance.get();
  • @Geinmachi 这似乎就是我想要的。我会尝试一下。如果您想将其发布为答案,我会在验证后将其标记为。
  • 什么“用户等级”? ...但是,您的 VIEW 中需要 EM 和 UT 这一事实表明您的应用程序中存在更基本的设计问题。

标签: jsf jsf-2 cdi


【解决方案1】:

Instance 接口应该做你需要的:

Instance<TableView> tableViewInstance;
TableView anotherView = tableViewInstance.get();

但正如 cmets 中所述,您的视图不应该有/知道交易和实体管理器。

【讨论】:

  • 我的 TableView 对象是有状态的 DAO,它提供了从数据库中获取记录列表的方法。状态包括第一条记录、查询大小、过滤器、排序等。它应该如何构建 CriteriaQueries 并在不访问 EntityManager 的情况下运行它们?关于 JPA 和 CDI,有什么我不知道的规则吗?
  • “有状态的 DAO”是什么意思? EJB @Stateful?您的 TableView 有 @Named 注释,所以它不是绑定到 xhtml 页面吗?如果是这样,那么它是表示层,您在TableView(事务和EM)中所做的事情应该在业务逻辑层(EJB @Stateless@Stateful)中通过依赖注入(@Inject@EJB)进行委托)。
  • 这是 JSF Web 应用程序而不是 EJB。 backing bean 被注入到 JSF Servlet 的上下文中,它又需要注入各种数据访问对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多