簡體   English   中英

Java EE CDI部署異常-WELD-001408:帶有限定符@Default的EntityManager類型的依賴關系未滿足

[英]Java EE CDI Deployment Exception - WELD-001408: Unsatisfied dependencies for type EntityManager with qualifiers @Default

我是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:在注入點[BackedAnnotatedParameter]帶有限定符@Default的EntityManager類型的不滿意依賴項[BackedAnnotatedConstructor]的參數1 @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。 (Validator.java:143)在org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:164)在org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:526)在org.jboss。在org.jboss.weld.bootstrap.ConcurrentValidator $ 1.doWork(ConcurrentValidator.java:62)處的weld.bootstrap.ConcurrentValidator $ 1.doWork(ConcurrentValidator.java:64)在org.jboss.weld.executor.IterativeWorkerTaskFactory $ 1.call(IterativeWorkerTask .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(未知源) rce)

依賴注入在我的資源和服務類中似乎運行良好:

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();
    }

    ...

}

從我在其他帖子和其他地方看到的內容來看,似乎我已經具備了完成此工作所需的一切,但我一直在收到這種例外情況。 我想念什么?

由於在bean-discovery-mode中將bean-discovery-mode設置為"annotated" ,因此CDI不會將EntityManagerProducer視為Bean,並且不會激活生產者方法。

EntityManagerProducer上添加范圍。 @ApplicationScoped可能適合這種情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM