java - 在 Wildfly 模块中找不到持久单元

标签 java hibernate module wildfly-10

我的场景如下:我有一堆不同的应用程序(WAR)在WildFly服务器上运行。它们每个的一个常见功能是,如果设置了特定标志(一种具有更细粒度可配置性的高级“终止开关”),它们应该在数据库中查找某些内容并表现出不同的行为。

整个事情被实现为一个过滤器,在每个请求上调用(使用一些缓存以避免过于频繁地查询数据库)。如果我将过滤器逻辑(我们称之为killswitch.jar)集成到每个war应用程序中(并相应地配置web.xml),那么这是预期的并且应该像它应该的那样工作)。

从可维护性和避免冗余的角度来看,我觉得这有点不太令人满意。因此,我想将整个东西放入 WildFly 模块中,以避免在每次 war 中捆绑 jar。我将 jar 和 module.xml (如下所示)放在正确的位置,然后模块就被加载了。

module.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<module xmlns="urn:jboss:module:1.0" name="my.company.domain.killswitch">
     <resources>    
          <resource-root path="killswitch.jar"/>
     </resources>  
     <dependencies>    
          <module name="org.jboss.logging"/>
          <module name="javax.api"/>
          <module name="com.microsoft.sqlserver"/>
          <module name="org.slf4j.jcl-over-slf4j"/>
          <module name="org.jboss.as.web" />
          <module name="javax.servlet.api" />
          <module name="javax.persistence.api" />
          <module name="javax.api"/>
          <module name="javax.inject.api"/>
          <module name="org.hibernate" services="import"/>
      </dependencies>
</module> 

(事实上,这并不是全部事实:这个模块是在模块层次结构中加载的。模块 A 依赖于模块 B,模块 B 依赖于这个模块。但据我所知,这都是有效的,并且这三个模块都有效被加载,所以恕我直言,这不重要。)

问题是,在服务器启动时找不到模块中定义的持久单元:

在部署 MyAwesomeApplication.war 中找不到名为“Killswitch”的持久性单元

但是,正如您可以想象的那样,持久性单元就在那里。当然,persistence.xml 也是如此,而且它格式良好且有效。我绝对可以确认这一点,因为如果用作模块,它无需任何更改即可工作。

我读过一些关于类似问题的帖子。有些人说,我试图实现的目标是不可能实现的。其他人谈论 META-INF、类加载器或加载模块的顺序。我尝试了一些解决方案,但没有成功。由于我不是野蝇或 JAP 专业人士,我现在很茫然,请求您的帮助:

  1. 我的目标有可能实现吗?
  2. 如果是这样,你会怎么做?如果没有,您能想到其他替代方案来在每次 war 中捆绑 killswitch.jar 吗?

非常感谢!

最佳答案

虽然我的场景与你的不同,但我也遇到了同样的问题,Wildfly 没有找到持久性单元,即使它在那里。

经过几个小时的努力和搜索,我解决了我的问题,只需将我的 persistence.xml 放入我的 WAR 所依赖的 JAR 之一的 META-INF 文件夹中即可。

您还可以构建一个单独的轻量级 jar,其中仅包含带有 persistence.xml 文件的 META-INF,或者更好地将其添加到您的 WAR 所依赖的 JAR 之一中。

official documentation Wildfly 指出:

The persistence.xml contains the persistence unit configuration (e.g. datasource name) and as described in the JPA 2.0 spec (section 8.2), the jar file or directory whose META-INF directory contains the persistence.xml file is termed the root of the persistence unit. In Java EE environments, the root of a persistence unit must be one of the following (quoted directly from the JPA 2.0 specification):

"

  • an EJB-JAR file
  • the WEB-INF/classes directory of a WAR file
  • a jar file in the WEB-INF/lib directory of a WAR file
  • a jar file in the EAR library directory
  • an application client jar file

"

请注意,在我找到的许多答案中,第二个选项似乎不起作用。

希望它可以帮助您和其他遇到同样问题的人

关于java - 在 Wildfly 模块中找不到持久单元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49446884/

相关文章:

java - Maven 故障保护不运行测试

java - 选择查询未能找到记录

java - 使用 Stream DSL 在 Kafka Streams 中指定每个流/表时间戳提取器

java - "IllegalArgumentException occurred while calling setter for property"从sqlserver数字到java对象

java - Hibernate 按内部 bean 的属性排序?

德尔福: force unload injected module

python - 如何在当前模块上调用 setattr()?

java - JComboBox.setModel 在操作过程中保持选择

java - org.hibernate.LazyInitializationException : could not initialize proxy - no Session, encore un fois

intellij-idea - IntelliJ IDEA 项目模块与 Java 9 模块的概念不同吗?