在Wildfly 11部署javaee-angularjs.war时找不到持久化单元‘siscorp’
从你碰到的错误信息来看,核心问题很明确:你的CDI托管bean尝试注入名为siscorp的持久化单元(PU),但在javaee-angularjs.war部署包里压根找不到这个PU,直接导致Weld启动服务挂掉了。下面是一步步的排查和解决思路:
1. 先检查persistence.xml的位置和内容
首先得确认你的persistence.xml文件有没有在正确的位置:
- 对于WAR包来说,这个文件必须放在
WEB-INF/classes/META-INF/目录下;如果PU是定义在依赖的JAR包里,那就要放在JAR的META-INF/目录下 - 打开
persistence.xml,确保里面确实定义了名为siscorp的持久化单元,格式大概是这样的:
<persistence-unit name="siscorp" transaction-type="JTA"> <!-- 这里填数据源、实体类扫描等配置 --> </persistence-unit>
注意name属性的拼写、大小写必须和你CDI bean里注入时指定的完全一致,一点都不能错。
2. 核对CDI bean里的注入代码
检查你注入持久化单元的代码,比如用@PersistenceUnit或者@PersistenceContext的地方:
@Inject @PersistenceUnit(unitName = "siscorp") private EntityManagerFactory emf;
或者:
@PersistenceContext(unitName = "siscorp") private EntityManager em;
这里的unitName必须和persistence.xml里的PU名称严格匹配,别出现拼写错误或者大小写不一致的情况。
3. 检查WAR包的实际结构
把你的javaee-angularjs.war解压开,确认两件事:
WEB-INF/classes/META-INF/persistence.xml确实存在- 这个文件里确实包含
siscorp的PU定义
如果你的PU是来自某个依赖JAR,那要确保这个JAR已经被正确打包到WEB-INF/lib目录下,并且JAR内部的META-INF/persistence.xml里有目标PU。
4. 验证Wildfly的数据源配置(如果PU用到了)
如果你的PU引用了Wildfly里的数据源,还要额外检查:
- Wildfly的
standalone.xml(或者domain.xml)里已经配置了对应的数据源,而且JNDI名称和persistence.xml里的jta-data-source/non-jta-data-source完全一致 - 这个数据源已经正常启动,没有连接数据库的问题
5. 清理缓存后重新部署
有时候服务器缓存会搞出奇怪的问题,试试这几步:
- 先停掉Wildfly服务器
- 删除
standalone/data和standalone/tmp目录下的所有内容 - 重新打包你的应用,确保所有配置都没问题
- 重启Wildfly再重新部署
你提供的错误原文:
{"WFLYCTL0080: Failed services" => {"jboss.deployment.unit."javaee-angularjs.war".WeldStartService" => "启动服务失败,原因:java.lang.IllegalArgumentException: WFLYWELD0037: 将持久化单元注入CDI托管bean时出错。在部署包javaee-angularjs.war中找不到名为‘siscorp’的持久化单元,无法注入至私有javax.persistence.E..."}}
内容的提问来源于stack exchange,提问作者Rafael Augusto

