【问题标题】:Java EE CDI Deployment Exception - WELD-001408: Unsatisfied dependencies for type EntityManager with qualifiers @DefaultJava EE CDI 部署异常 - WELD-001408:具有限定符 @Default 的类型 EntityManager 的依赖关系不满足
【发布时间】:2019-08-30 14:30:50
【问题描述】:

我对 Java EE 还很陌生。我已经搜索了很长时间,但找不到解决其他人遇到的问题的方法。我查看了关于 SO 的其他相关帖子,并查看了其他帖子建议的 JBoss 和 Oracle 文档,但我仍然无法解决我的问题。我正在使用 Eclipse 开发一个使用 JPA 与 MariaDB 交互的 JAX-RS 应用程序。我使用 Maven webapp-jee7-liberty 原型来创建项目,所以我在 Liberty 运行时运行它。以下是我的项目方面:

这是我的项目结构:

beans.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans bean-discovery-mode="annotated"
  xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"/>

web.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
    <display-name>journal-task-mgr</display-name>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>
</web-app>

这是我的存储库类:

package me.org.jtm.repository;

import java.util.List;

import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.TypedQuery;

import me.org.jtm.repository.bean.Task;

@RequestScoped
public class TaskRepositoryImpl implements TaskRepository {

    private EntityManager em;
    private EntityTransaction tx;

    @Inject
    public TaskRepositoryImpl(EntityManager em) {
        this.em = em;
        this.tx = em.getTransaction();
    }

    @Override
    public List<Task> get() {
        tx.begin();
        List<Task> resultList = em.createNamedQuery("AllTaskEntries", Task.class).getResultList();
        tx.commit();
        return resultList;
    }

    ...

}

我创建了一个生产者,以便能够为 EntityManager 使用@Inject 注解:

package me.org.jtm.repository;

import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.Produces;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

public class EntityManagerProducer {
    @PersistenceContext
    private EntityManager em;

    @Produces
    @RequestScoped
    public EntityManager entityManager() {
        return em;
    }
}

这是我的 persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
    <persistence-unit name="journal-task-mgr" transaction-type="JTA">
        <jta-data-source>jdbc/JournalTaskMgrMariaDb</jta-data-source>
        <class>me.org.jtm.repository.bean.Journal</class>
        <class>me.org.jtm.repository.bean.Task</class>
        <class>me.org.jtm.repository.bean.User</class>
    </persistence-unit>
</persistence>

但我在启动时收到此错误:

org.jboss.weld.exceptions.DeploymentException: WELD-001408: 带有限定符的 EntityManager 类型的依赖关系不满足 @Default at injection point [BackedAnnotatedParameter] 参数 1 [BackedAnnotatedConstructor] @Inject public me.org.jtm.repository.TaskRepositoryImpl(EntityManager) 在 me.org.jtm.repository.TaskRepositoryImpl.(TaskRepositoryImpl.java:0)

在 org.jboss.weld.bootstrap.Validator.validateInjectionPointForDeploymentProblems(Validator.java:378) 在 org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:290) 在 org.jboss.weld.bootstrap.Validator.validateGeneralBean(Validator.java:143) 在 org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:164) 在 org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:526) 在 org.jboss.weld.bootstrap.ConcurrentValidator$1.doWork(ConcurrentValidator.java:64) 在 org.jboss.weld.bootstrap.ConcurrentValidator$1.doWork(ConcurrentValidator.java:62) 在 org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:62) 在 org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:55) 在 java.util.concurrent.FutureTask.run(Unknown Source) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(未知来源)在 java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(未知来源)

依赖注入似乎在我的资源和服务类中运行良好:

package me.org.jtm.resources;

import java.util.List;

import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriBuilder;
import javax.ws.rs.core.UriInfo;

import me.org.jtm.domain.TaskService;
import me.org.jtm.repository.bean.Task;

@RequestScoped
public class TaskResourceImpl implements TaskResource {
    private TaskService taskService;

    @Inject
    public TaskResourceImpl(TaskService taskService) {
        this.taskService = taskService;
    }

    @Override
    public Response get() {
        List<Task> tasks = taskService.getAll();    
        return Response.ok(tasks).build();
    }

    ...

}

从我在其他帖子和其他地方看到的情况来看,我似乎已经具备了为此工作所需的条件,但我不断收到此异常。我错过了什么?

【问题讨论】:

  • 您能否尝试在您的EntityManagerProducer 中添加一个范围(@ApplicationScoped 可以)?我建议这样做的原因是您指定了bean-discovery-mode="annotated"
  • 做到了!处理了 DeploymentException 错误。请将其作为官方答案提供,以便我标记为已回答。但是,我遇到了另一个问题,资源类中对服务对象的引用为空。我将 Inject 注释从构造函数移到了字段,添加了一个无参数构造函数,它解决了这个问题。有趣的是,我不必在服务类中执行此操作,在该服务类中,我在构造函数上添加了 Inject 注释,该构造函数接受对存储库的引用。你知道为什么会这样吗?
  • 哦,我在使用 JAX-RS(Thorntail 上的 Resteasy)时遇到了同样的问题,它不理解构造函数注入!我投降了,现在我在我的资源中使用字段注入:) 我很快就会添加答案...

标签: java jax-rs cdi jpa-2.0 java-ee-7


【解决方案1】:

由于在 beans.xml 中 bean-discovery-mode 被设置为 "annotated",CDI 不会将 EntityManagerProducer 视为 Bean 并且不会激活生产者方法。

EntityManagerProducer 上添加一个范围。 @ApplicationScoped 可能适合这种情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-10
    • 2018-12-19
    • 2015-04-05
    • 1970-01-01
    • 2014-12-20
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多