【问题标题】:EJB inject unsatisfied dependenciesEJB 注入未满足的依赖项
【发布时间】:2018-02-25 14:17:59
【问题描述】:

我正在尝试使用 Wildfly 和数据库连接创建一个 EJB Web 项目,以持久保存我的类“文章”。但是当我启动我的应用程序时,我得到了错误

引起:org.jboss.weld.exceptions.DeploymentException:WELD-001408: 带有限定符 @Default 的 ArticleDAO 类型的依赖关系不满足 在注入点 [BackedAnnotatedField] @Inject private services.Customer.dao(Customer.java:0) 上的 services.Customer.dao

这个异常是由我的@Inject 语句引起的,但我不知道问题出在哪里。我已经在网上搜索并在 meta-inf 文件夹中放置了 beans.xml:

bean-discovery-mode="all">

但没有成功。这是我的相关课程:

客户.java

package serrvices;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import beans.CustomerManager;


@Path("customer")
public class Customer {

    @EJB
    private CustomerManager manager;


    /*
    @GET
    @Produces(MediaType.TEXT_HTML)
    public String getCustomerCount() {
        return "<h3>Customer Count: " + manager.getCustomerCount() + "</h3>";
    }
    */

    @Inject
    private ArticleDAO dao;




    @GET
    //@Consumes({"application/xml", "application/json"})
    public void insert()
    {
        ArticleDTO userr = new ArticleDTO(999,"XXX",99);
        System.out.println("insert: " + userr);

        dao.createArticle(userr.getDescription(), userr.getPrice());
    }

}

文章DAO

打包服务;

import java.util.List;


public interface ArticleDAO
{
    Article insert(Article user);
    Article update(Article user);
    void delete(Article user);

    Article findById(int id);
    List<Article> findAll();

    Article createArticle(String description, long price);
}

文章DAOImpl

package serrvices;

import java.util.List;

import javax.ejb.LocalBean;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;



class ArticleDAOImpl
    implements ArticleDAO
{
    //private final Logger LOG = Logger.getLogger(ArticleDAOImpl.class);

    @PersistenceContext
    private EntityManager em;


    /*
     * CRUD Operations
     */ 

    @Override
    public Article insert(Article article)
    {
        System.out.println("insert(" + article + ")");
        em.persist(article);
        return article;
    }

    @Override
    public Article update(Article article)
    {
        System.out.println("update(" + article + ")");
        return em.merge(article);
    }

    @Override
    public void delete(Article article)
    {
        System.out.println("delete(" + article + ")");
        em.remove(article);
    }

    @Override
    public Article findById(int id)
    {
        System.out.println("findById(" + id + ")");
        return em.find(Article.class, id);
    }

    @SuppressWarnings("unchecked")
    @Override
    public List<Article> findAll()
    {
        System.out.println("findAll()");
        final String hql = "SELECT u FROM " + Article.class.getName() + " AS u";        
        return em.createQuery(hql).getResultList();
    }   


    /*
     * Factory methods
     */

    @Override
    public Article createArticle(String description, long price)
    {
        System.out.println("createArticle(\"" + description + "\"," + price +")");

        Article u = new Article();
        u.setDescription(description);
        u.setPrice(price);  
        insert(u);
        return u;
    }
}

【问题讨论】:

  • 我知道,扫描应该不需要这样做,但是您是否已经尝试对 bean 进行适当的注释。您可以将 ArticleDAOImpl 注释为 @ApplicationScoped。下一个选项是看看,如果你注入 ArticleDAOImpl 而不是接口会发生什么。我知道这不是必需的,但也许一些指针可以让您进一步了解问题的原因。
  • 如果您在战争项目中,请将 beans.xml 放入 WEB-INF 而不是 META-INF。如果发现模式为 all,则无需添加 @ApplicationScoped 注解。

标签: ejb wildfly inject


【解决方案1】:

CDI容器在初始化bean并注入依赖时,只能将对象注入到容器知道的其他对象中,否则不会进行注入。容器必须知道您要注入的类。

尝试使用@Named@ApplicationScoped 注释您的ArticleDAOImpl CLASS

【讨论】:

  • 不推荐特定范围。如果应用不当,ApplicationScoped 可能会引入问题。他们确实需要使用适当的 CDI 范围指定来注释 bean,但上下文将决定哪个最有意义。
猜你喜欢
  • 1970-01-01
  • 2020-09-11
  • 2019-09-12
  • 1970-01-01
  • 1970-01-01
  • 2012-02-20
  • 2014-11-23
  • 2016-08-29
  • 2019-01-25
相关资源
最近更新 更多