Java EE CDI部署异常-WELD-001408:使用限定符@Default的EntityManager类型的未满足依赖项

Java EE CDI部署异常-WELD-001408:使用限定符@Default的EntityManager类型的未满足依赖项,java,jax-rs,cdi,jpa-2.0,java-ee-7,Java,Jax Rs,Cdi,Jpa 2.0,Java Ee 7,我对JavaEE相当陌生。我已经找了很长时间,但找不到解决别人遇到的问题的方法。我已经看过了其他相关的文章,也看过了其他文章中提到的JBoss和Oracle文档,但我仍然无法解决我的问题。我正在使用Eclipse开发一个JAX-RS应用程序,它使用JPA与MariaDB交互。我使用Maven webapp-jee7-liberty原型创建了这个项目,所以我在liberty运行时运行它。以下是我的项目方面: 以下是我的项目结构: beans.xml文件: <?xml version="1

我对JavaEE相当陌生。我已经找了很长时间,但找不到解决别人遇到的问题的方法。我已经看过了其他相关的文章,也看过了其他文章中提到的JBoss和Oracle文档,但我仍然无法解决我的问题。我正在使用Eclipse开发一个JAX-RS应用程序,它使用JPA与MariaDB交互。我使用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"/>
<?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>
以下是我的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>

jdbc/JournalTaskMgrMariaDb
me.org.jtm.repository.bean.Journal
me.org.jtm.repository.bean.Task
me.org.jtm.repository.bean.User
但我在启动时遇到了这个错误:

org.jboss.weld.exceptions.DeploymentException:weld-001408: 具有限定符的类型EntityManager的不满意依赖项 @注入点的默认值[BackedAnnotatedParameter]参数1 [BackedAnnotatedConstructor]@InjectPublic的 me.org.jtm.repository.TaskRepositoryImpl(EntityManager)位于 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(未知源代码) 位于的java.util.concurrent.ThreadPoolExecutor.runWorker(未知源) java.util.concurrent.ThreadPoolExecutor$Worker.run(未知源代码)位于 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();
    }

    ...

}
package me.org.jtm.resources;
导入java.util.List;
导入javax.enterprise.context.RequestScope;
导入javax.inject.inject;
导入javax.ws.rs.core.Response;
导入javax.ws.rs.core.UriBuilder;
导入javax.ws.rs.core.UriInfo;
导入me.org.jtm.domain.TaskService;
导入me.org.jtm.repository.bean.Task;
@请求范围
公共类TaskResourceImpl实现TaskResource{
私人任务服务任务服务;
@注入
公共TaskResourceImpl(TaskService TaskService){
this.taskService=taskService;
}
@凌驾
公众反应{
List tasks=taskService.getAll();
返回Response.ok(tasks.build();
}
...
}

从我在其他帖子和其他地方看到的情况来看,我似乎已经具备了这项工作所需的条件,但我一直在得到这个例外。我错过了什么?

因为 bean发现模式< /C> >被设置为BeN.xml中的<代码>“注释”< /C> >,CDI不会考虑<代码> EntIdMaulePuthor <代码>,将不会激活生产者方法。


EntityManagerProducer
上添加作用域
@ApplicationScoped
可能适合这种情况。

请尝试将作用域(
@ApplicationScoped
可以)添加到您的
EntityManagerProducer
?我之所以建议这样做,是因为您指定了
bean discovery mode=“annotated”
。就是这样做的!处理了DeploymentException错误。请将其作为正式答案提供,以便我可以标记为已回答。但是,我遇到了另一个问题,资源类中对服务对象的引用为null。我将InjectAnnotation从构造函数移动到字段,添加了一个无参数构造函数,解决了这个问题。有趣的是,我不必在服务类中这样做,在服务类中,我在接受对存储库的引用的构造函数上有注入注释。你知道为什么会出现这种情况吗?哦,我对JAX-RS(Thorntail上的Resteasy)也有同样的问题,它不理解构造函数注入!我投降了,现在我在我的资源中使用了字段注入:)我将很快添加答案。。。
<?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>
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();
    }

    ...

}