CDI:WELD-001408不满意的依赖关系,如何解决?

时间:2014-03-05 07:32:43

标签: java-ee cdi glassfish-4 weld

我用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它不想工作。

有什么想法吗?

stacktrace:

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>

4 个答案:

答案 0 :(得分:14)

默认情况下,Java EE 7具有隐式bean归档,即bean类需要将作用域注释发现为CDI bean。

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

CDI 1.1 / Java EE 7中不再需要

beans.xml。如果你有一个,那么确切的版本和bean-discovery-mode会有所不同。请参阅CDI 1.1规范的Bean archives部分。

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

答案 1 :(得分:7)

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

答案 2 :(得分:0)

似乎DAOTest的存档没有beans.xml /错误的beans.xml。

答案 3 :(得分:0)

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

@Inject Service service

而不是

@Inject ServiceLocal service