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

前端之家收集整理的这篇文章主要介绍了java-ee – CDI:WELD-001408不满意的依赖关系,如何解决?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我做CDI的小测试项目.我的应用程序由EJB EAR和WAR组成,全部部署在Glassfish 4上.我使用Hibernate 4.3.4访问数据库.

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

SessionBean EJB的模式不是很棒,但是我必须修改已经创建的应用程序,所以我没有太多的选择.

这是我的EJB代码

  1. @Named
  2. public class DAOTest implements Serializable {
  3. private static final long serialVersionUID = 1L;
  4.  
  5. @PersistenceContext(unitName="CDI-ejb")
  6. private EntityManager em;
  7.  
  8. public void test(){
  9. //em.getClass();
  10. }
  11.  
  12.  
  13. public EntityManager getEm() {
  14. return em;
  15. }
  16.  
  17.  
  18. public void setEm(EntityManager em) {
  19. this.em = em;
  20. }
  21.  
  22. public DAOTest() {
  23. // TODO Auto-generated constructor stub
  24. }
  25.  
  26. }

Service.java

  1. @Stateless
  2. @LocalBean
  3. public class Service implements ServiceLocal {
  4.  
  5. @Inject DAOTest test;
  6. /**
  7. * Default constructor.
  8. */
  9. public Service() {
  10. // TODO Auto-generated constructor stub
  11. }
  12.  
  13.  
  14. @Override
  15. public void test() {
  16. test.test();
  17.  
  18. }
  19.  
  20.  
  21. }

和ServiceLocal.java

  1. @Local
  2. public interface ServiceLocal {
  3. void test();
  4. }

在我的战争中

  1. @WebServlet("/Test")
  2. public class Test extends HttpServlet {
  3. private static final long serialVersionUID = 1L;
  4. @Inject private ServiceLocal service;
  5.  
  6. /**
  7. * @see HttpServlet#HttpServlet()
  8. */
  9. public Test() {
  10. super();
  11. // TODO Auto-generated constructor stub
  12. }
  13.  
  14.  
  15. /**
  16. * @see HttpServlet#doGet(HttpServletRequest request,HttpServletResponse response)
  17. */
  18. protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {
  19. service.test();
  20. }
  21.  
  22.  
  23. /**
  24. * @see HttpServlet#doPost(HttpServletRequest request,HttpServletResponse response)
  25. */
  26. protected void doPost(HttpServletRequest request,IOException {
  27. // TODO Auto-generated method stub
  28. }
  29.  
  30.  
  31. }

我通过使用@ Stateless注释来对DAOTest进行了注释.一切都应该发生.所以CDI运作良好但是只要@命名它不想工作.

任何想法?

堆栈跟踪:

  1. 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

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

解决方法

默认情况下,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,很难说这个文件是否是问题的一部分.

猜你在找的Java相关文章