无法使用CDI将DAO注入EJB

时间:2014-12-27 19:12:52

标签: java java-ee jpa ejb cdi

我正在使用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应用服务器

4 个答案:

答案 0 :(得分:1)

JAVA EE 6 - CDI组件,给DAO @ApplicationScoped,然后它将允许注入persistentcontext

答案 1 :(得分:0)

@Stateless添加到您的ZoneDao班级,或者将此Bean作为范围,例如@SessionScoped

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

答案 2 :(得分:0)

ZoneDao未标记为托管bean,因此它不会像使用CDI那样工作。使用@Named注释ZoneDao,并使用@RequestScope,@ SessionScop,...等选择它的范围,或者你需要的范围,只有这样才能使用CDI注入托管bean。

答案 3 :(得分:0)

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