Java EE CDI部署异常WELD-001408:EntityManager依赖注入失败求助
从你的配置和代码来看,核心问题出在CDI容器没有发现你的EntityManager生产者类,导致无法生成EntityManager实例供TaskRepositoryImpl注入。下面一步步分析并给出解决方案:
1. 生产者类未被CDI扫描识别
你的EntityManagerProducer类没有添加任何CDI相关注解,而beans.xml设置了bean-discovery-mode="annotated"——这个模式下,CDI只会扫描带有CDI注解(如@ApplicationScoped、@RequestScoped、@Named等)的类作为可管理的Bean。
修复方案:给EntityManagerProducer添加一个CDI作用域注解,比如@ApplicationScoped(EntityManager本身是容器管理的,生产者类无需请求级作用域),同时建议显式指定持久化单元名称避免歧义:
package me.org.jtm.repository; import javax.enterprise.context.ApplicationScoped; import javax.enterprise.inject.Produces; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; @ApplicationScoped public class EntityManagerProducer { @PersistenceContext(unitName = "journal-task-mgr") private EntityManager em; @Produces public EntityManager entityManager() { return em; } }
2. 检查Liberty服务器特性配置
确保你的Liberty server.xml中已经启用了CDI、JPA等必需的特性,否则容器无法支持依赖注入和JPA功能:
<featureManager> <feature>cdi-2.0</feature> <!-- 或更高版本如cdi-3.0,匹配你的Java EE版本 --> <feature>jpa-2.2</feature> <!-- 对应JPA版本,也可使用jpa-3.0 --> <feature>jaxrs-2.1</feature> <!-- 你的JAX-RS应用依赖 --> <feature>jdbc-4.2</feature> <!-- 数据库连接支持 --> <feature>ejbLite-3.2</feature> <!-- JTA事务管理依赖 --> </featureManager>
如果缺少这些特性,CDI容器或JPA容器无法正常初始化,也会导致依赖注入失败。
3. 可选:升级persistence.xml版本
你当前使用的是JPA 1.0版本的persistence.xml,建议升级到更适配Java EE 7的版本(如2.2),提升兼容性:
<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.2" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.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>
额外建议
你的TaskRepositoryImpl中手动管理EntityTransaction,但在JTA事务类型的持久化单元下,更推荐使用容器管理事务(比如添加@Transactional注解),避免手动事务管理带来的潜在问题。
内容的提问来源于stack exchange,提问作者dotnetesse

