【问题标题】:Can't Inject DAO into EJB using CDI无法使用 CDI 将 DAO 注入 EJB
【发布时间】:2014-12-27 19:12:51
【问题描述】:

我正在使用 EJB3、JPA 和 JSF 开发一个应用程序,我想使用 CDI 将我的 DAO 注入到 EJB 中:

这是我的 DAO 代码:



    public class ZoneDao {

        @PersistenceContext(unitName = "wabApp3PU")
        private EntityManager em;

        /* Functions */

    }

这是我的 EJB 代码:



    @Stateless
    public class ZoneFacade{

        @Inject
        private ZoneDao zoneDao;

        /* Functions*/

    }

这是我得到的错误:

org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [ZoneDao] with qualifiers [@Default] at injection point [[BackedAnnotatedField] @Inject private fr.si.metier.ZoneFacade.zoneDao]

注意:我使用的是 glassfish 4 应用服务器

【问题讨论】:

  • 请添加一些详细信息 - 例如您要部署到的容器。
  • 如果您使用的是 Java EE 6,请检查 META-INF 文件夹中是否有 beans.xml

标签: java jakarta-ee jpa ejb cdi


【解决方案1】:

JAVA EE 6 - CDI 组件,给 DAO @ApplicationScoped,然后它会允许注入持久化上下文

【讨论】:

    【解决方案2】:

    @Stateless 添加到您的 ZoneDao 类或给这个 Bean 一个范围,例如@SessionScoped.

    如果使用 Java EE 6,请确保您有 beans.xml。对于版本 7,不再需要它。

    【讨论】:

    • 我已经在我的 DAO bean 中尝试过 @stateless 并且效果很好,但这是一个好的解决方案吗?我不能使用 CDI 将一个简单的 java Pojo 注入到 EJB 中吗?
    • 您必须以某种方式注释 Pojo 以使其能够注入。 Plan Pojo-Injection 应该适用于 CDI,但似乎不受 JBoss 支持。使用无状态会话 Bean 作为 DAO 很常见 - 但还有另一个关于它的讨论 here
    【解决方案3】:

    ZoneDao 没有被标记为托管 bean,因此它不会像使用 CDI 那样工作。使用 @Named 注释 ZoneDao,并使用 @RequestScope、@SessionScop、...等或您需要的任何范围选择它的范围,只有这样它将是一个可以使用 CDI 注入的托管 bean。

    【讨论】:

      【解决方案4】:
      1. 您使用的是哪个 IDE?如果是 Netbeans,请检查它是否在 META-INF/WEB-INF 文件夹中生成了 beans.xml。如果有,请检查以确保默认 bean-discovery 模式未设置为带注释的,如果是,请使用 @Dependent 注释 DAO。
      2. 您不能使用@PersistenceContext 将entitymanager 注入CDI bean。(直到CDI 人员或服务器供应商更改此设置)。简单的解决方案,您似乎正在学习将实体管理器注入无状态 bean(如果您在战争应用程序中使用 ejb,则可以注入无状态 EJB)

      【讨论】:

        猜你喜欢
        • 2012-10-21
        • 1970-01-01
        • 2014-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-26
        • 2013-11-15
        • 1970-01-01
        相关资源
        最近更新 更多