Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jakarta ee CDI:WELD-001408未满足的依赖项,如何解决?_Jakarta Ee_Cdi_Glassfish 4_Weld - Fatal编程技术网

Jakarta ee CDI:WELD-001408未满足的依赖项,如何解决?

Jakarta ee CDI:WELD-001408未满足的依赖项,如何解决?,jakarta-ee,cdi,glassfish-4,weld,Jakarta Ee,Cdi,Glassfish 4,Weld,我用CDI做了一个小的测试项目。我的应用程序由EJB EAR和WAR组成,它们都部署在Glassfish 4上。我正在使用Hibernate4.3.4访问数据库 我的目标是验证EJB(DAO)中的类是否可以接收EntityManager的注入 SessionBean+EJB模式并不完美,但我必须修改已经创建的应用程序,因此我没有太多选择 以下是我的EJB代码: @Named public class DAOTest implements Serializable { private st

我用CDI做了一个小的测试项目。我的应用程序由EJB EAR和WAR组成,它们都部署在Glassfish 4上。我正在使用Hibernate4.3.4访问数据库

我的目标是验证EJB(DAO)中的类是否可以接收EntityManager的注入

SessionBean+EJB模式并不完美,但我必须修改已经创建的应用程序,因此我没有太多选择

以下是我的EJB代码:

@Named
public class DAOTest implements Serializable {
    private static final long serialVersionUID = 1L;

    @PersistenceContext(unitName="CDI-ejb")
    private EntityManager em;

    public void test(){
        //em.getClass();
    }


    public EntityManager getEm() {
       return em;
    }


    public void setEm(EntityManager em) {
        this.em = em;
    }

    public DAOTest() {
        // TODO Auto-generated constructor stub
    }

}
Service.java

@Stateless
@LocalBean
public class Service implements ServiceLocal {

    @Inject DAOTest test;
    /**
    * Default constructor. 
    */
    public Service() {
        // TODO Auto-generated constructor stub
    }


    @Override
    public void test() {
        test.test();

    }


}
和ServiceLocal.java

@Local
public interface ServiceLocal {
    void test();
}
在我的战争中:

@WebServlet("/Test")
public class Test extends HttpServlet {
    private static final long serialVersionUID = 1L;
    @Inject private ServiceLocal service;

    /**
    * @see HttpServlet#HttpServlet()
    */
    public Test() {
        super();
        // TODO Auto-generated constructor stub
    }


    /**
    * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
    */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        service.test();
    }


    /**
    * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }


 }
我通过使用@Stateless注释对DAOTest进行了测试。一切都按它应该发生的那样发生。所以CDI工作得很好。但仅使用@Named,它不想工作

有什么想法吗

堆栈跟踪:

org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [DAOTest] with qualifiers [@Default] at injection point [[BackedAnnotatedField] @Inject test.Service.test]
mybeans.xml

<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
</beans>


DAOTest的归档文件似乎没有beans.xml/misplaced beans.xml

JavaEE7默认具有隐式bean存档,即bean类需要作为CDIBean发现范围注释

@Named
不是范围批注。请改用
@Dependent

cdi1.1/javaee7中不再需要
beans.xml
。如果您确实有一个,那么确切的版本和
bean发现模式将有所不同。请参见CDI 1.1规范的一节


由于您没有发布您的
beans.xml
,因此很难判断此文件是否是问题的一部分。

由于这是我在搜索WELD-001408时获得的第一个命中率,我还要提到一个原因,那就是缺少无参数构造函数。这显然不是OP的情况,但在我自己的情况下,这是问题的原因,因此这可能也有助于其他人。

@LocalBean意味着您将注入bean,而不是接口

@Inject Service service
而不是

@Inject ServiceLocal service

我已经将beans.xml放入EJB项目的META-INF和WAR项目的WEB-INF中。DAOTest与Service.java放在同一个项目中。管理EntityManager的容器是否可能与CDI容器不同。所以CDI不能在EntityManager中注入@PersistenceContext?嵌入Glassfish 4的CDI版本是什么?好的,可以了。正如您所说,它缺少DAOTest.java上的Scope标记。非常感谢。2020年,CDI 2和Weld 3仍然是一个相关的答案。今天为我工作。