【问题标题】:CDI : WELD-001408 Unsatisfied dependencies, how to resolve it?CDI : WELD-001408 不满足的依赖关系,如何解决?
【发布时间】:2014-04-07 03:13:51
【问题描述】:

我使用 CDI 进行了一个小型测试项目。我的应用程序由 EJB EAR 和 WAR 组成,全部部署在 Glassfish 4 上。我使用 Hibernate 4.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]

我的 beans.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>

【问题讨论】:

    标签: jakarta-ee cdi glassfish-4 weld


    【解决方案1】:

    由于这是我在搜索 WELD-001408 时遇到的第一个问题,因此我还要提到一个原因,即缺少无参数构造函数。这显然不是 OP 的情况,但它是我自己情况下问题的原因,所以这也可能对其他人有所帮助。

    【讨论】:

    • 在 2020 年仍然是一个相关的答案,带有 CDI 2 和 Weld 3。今天为我工作。
    【解决方案2】:

    @LocalBean 表示您将注入 bean 而不是接口

    @Inject Service service
    

    而不是

    @Inject ServiceLocal service
    

    【讨论】:

      【解决方案3】:

      Java EE 7 默认具有隐式 bean 存档,即 bean 类需要作为 CDI bean 发现的作用域注释。

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

      beans.xml 在 CDI 1.1/Java EE 7 中不再需要。如果您有,那么确切的版本和bean-discovery-mode 会有所不同。请参阅 CDI 1.1 规范的 Bean archives 部分。

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

      【讨论】:

      • Glassfish 4 内嵌的 CDI 版本是什么?
      • 好的,它的作品。正如您所说,它缺少 DAOTest.java 上的 Scope 标记。真的谢谢你。
      【解决方案4】:

      似乎 DAOTest 的存档没有 beans.xml/放错位置的 beans.xml。

      【讨论】:

      • 我已将 beans.xml 放入 EJB 项目的 META-INF 和 WAR 项目的 WEB-INF。 DAOTest 与 Service.java 放在同一个项目中。管理 EntityManager 的容器是否可能与 CDI 容器不同。所以CDI不能用@PersistenceContext注入EntityManager?
      猜你喜欢
      • 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
      相关资源
      最近更新 更多