【发布时间】: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 注解。