EJB 模块无法访问 JPA 实体
EJB module can't reach JPA entities
我有一个包含 4 个模块的 Maven 项目:包含 persistence.xml 的 JPA 模块、EJB 模块、Webapp 模块和 EAR 模块。
我使用 EJB 模块将实体保存在数据库中。现在,当我尝试使用 JPA 模块中的任何实体时,我在 Wildfly 9 中收到以下错误:
22:42:59,298 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-6) MSC000001: Failed to start service jboss.deployment.unit."MusicEJB.jar".POST_MODULE: org.jboss.msc.service.StartException in service jboss.deployment.unit."MusicEJB.jar".POST_MODULE: WFLYSRV0153: Failed to process phase POST_MODULE of deployment "MusicEJB.jar"
at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:163)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1948)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1881)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.RuntimeException: WFLYSRV0177: Error getting reflective information for class authentication.AuthEJB with ClassLoader ModuleClassLoader for Module "deployment.MusicEJB.jar:main" from Service Module Loader
at org.jboss.as.server.deployment.reflect.DeploymentReflectionIndex.getClassIndex(DeploymentReflectionIndex.java:70)
at org.jboss.as.ee.metadata.MethodAnnotationAggregator.runtimeAnnotationInformation(MethodAnnotationAggregator.java:57)
at org.jboss.as.ee.component.deployers.InterceptorAnnotationProcessor.handleAnnotations(InterceptorAnnotationProcessor.java:107)
at org.jboss.as.ee.component.deployers.InterceptorAnnotationProcessor.processComponentConfig(InterceptorAnnotationProcessor.java:92)
at org.jboss.as.ee.component.deployers.InterceptorAnnotationProcessor.deploy(InterceptorAnnotationProcessor.java:77)
at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:156)
... 5 more
Caused by: java.lang.NoClassDefFoundError: entity/User
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.getDeclaredMethods(Class.java:1975)
at org.jboss.as.server.deployment.reflect.ClassReflectionIndex.<init>(ClassReflectionIndex.java:65)
at org.jboss.as.server.deployment.reflect.DeploymentReflectionIndex.getClassIndex(DeploymentReflectionIndex.java:66)
... 10 more
Caused by: java.lang.ClassNotFoundException: entity.User from [Module "deployment.MusicEJB.jar:main" from Service Module Loader]
at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:205)
at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:455)
at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:404)
at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:385)
at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:130)
... 15 more
这是我的 persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
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_1.xsd">
<persistence-unit name="MusicProjectPersistence" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:jboss/datasources/postgresDS</jta-data-source>
<class>entity.User</class>
<class>entity.MusicFile</class>
<class>entity.Playlist</class>
<properties>
<property name="hibernate.archive.autodetection" value="class" />
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
<property name="hibernate.connection.driver_class" value="org.postgresql.Driver" />
<property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/musicdb" />
<property name="hibernate.connection.username" value="music" />
<property name="hibernate.connection.password" value="music" />
<property name="hibernate.flushMode" value="FLUSH_AUTO" />
<property name="hibernate.hbm2ddl.auto" value="update" />
</properties>
</persistence-unit>
</persistence>
我的 EJB 中有 JPA 模块 pom.xml
我做错了什么?
在使用WildFly时,你通常没有必要使用EAR打包,而是将所有东西都放在一个WAR中,导致没有不同的类加载器,这可能会为你解决问题。
查看 Adam Bien's example 使用 WAR 打包的基于 maven 的项目 - 它不使用 JPA 模块,但我想你会明白的。
您的 EJB 无法找到您的实体 classes,因为如果您在构建后打开您的 ear 文件,您会发现您的 JPA 模块位于 EJB 模块旁边,而不是在 lib 文件夹中。解决方案非常简单。只需将 JPA 模块作为依赖项添加到 ear 模块的 POM 中。这样,您的 JPA 模块将成为您耳朵的 lib 文件夹中的一个 jar,然后您的 EJB 和 Web 模块可以在它们的 class 路径中找到 JPA 实体。添加依赖项后,构建您的项目并检查 ear lib 文件夹以确保您的 JPA 模块是它们的 jar。
我有一个包含 4 个模块的 Maven 项目:包含 persistence.xml 的 JPA 模块、EJB 模块、Webapp 模块和 EAR 模块。
我使用 EJB 模块将实体保存在数据库中。现在,当我尝试使用 JPA 模块中的任何实体时,我在 Wildfly 9 中收到以下错误:
22:42:59,298 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-6) MSC000001: Failed to start service jboss.deployment.unit."MusicEJB.jar".POST_MODULE: org.jboss.msc.service.StartException in service jboss.deployment.unit."MusicEJB.jar".POST_MODULE: WFLYSRV0153: Failed to process phase POST_MODULE of deployment "MusicEJB.jar"
at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:163)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1948)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1881)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.RuntimeException: WFLYSRV0177: Error getting reflective information for class authentication.AuthEJB with ClassLoader ModuleClassLoader for Module "deployment.MusicEJB.jar:main" from Service Module Loader
at org.jboss.as.server.deployment.reflect.DeploymentReflectionIndex.getClassIndex(DeploymentReflectionIndex.java:70)
at org.jboss.as.ee.metadata.MethodAnnotationAggregator.runtimeAnnotationInformation(MethodAnnotationAggregator.java:57)
at org.jboss.as.ee.component.deployers.InterceptorAnnotationProcessor.handleAnnotations(InterceptorAnnotationProcessor.java:107)
at org.jboss.as.ee.component.deployers.InterceptorAnnotationProcessor.processComponentConfig(InterceptorAnnotationProcessor.java:92)
at org.jboss.as.ee.component.deployers.InterceptorAnnotationProcessor.deploy(InterceptorAnnotationProcessor.java:77)
at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:156)
... 5 more
Caused by: java.lang.NoClassDefFoundError: entity/User
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.getDeclaredMethods(Class.java:1975)
at org.jboss.as.server.deployment.reflect.ClassReflectionIndex.<init>(ClassReflectionIndex.java:65)
at org.jboss.as.server.deployment.reflect.DeploymentReflectionIndex.getClassIndex(DeploymentReflectionIndex.java:66)
... 10 more
Caused by: java.lang.ClassNotFoundException: entity.User from [Module "deployment.MusicEJB.jar:main" from Service Module Loader]
at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:205)
at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:455)
at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:404)
at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:385)
at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:130)
... 15 more
这是我的 persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
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_1.xsd">
<persistence-unit name="MusicProjectPersistence" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:jboss/datasources/postgresDS</jta-data-source>
<class>entity.User</class>
<class>entity.MusicFile</class>
<class>entity.Playlist</class>
<properties>
<property name="hibernate.archive.autodetection" value="class" />
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
<property name="hibernate.connection.driver_class" value="org.postgresql.Driver" />
<property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/musicdb" />
<property name="hibernate.connection.username" value="music" />
<property name="hibernate.connection.password" value="music" />
<property name="hibernate.flushMode" value="FLUSH_AUTO" />
<property name="hibernate.hbm2ddl.auto" value="update" />
</properties>
</persistence-unit>
</persistence>
我的 EJB 中有 JPA 模块 pom.xml
我做错了什么?
在使用WildFly时,你通常没有必要使用EAR打包,而是将所有东西都放在一个WAR中,导致没有不同的类加载器,这可能会为你解决问题。
查看 Adam Bien's example 使用 WAR 打包的基于 maven 的项目 - 它不使用 JPA 模块,但我想你会明白的。
您的 EJB 无法找到您的实体 classes,因为如果您在构建后打开您的 ear 文件,您会发现您的 JPA 模块位于 EJB 模块旁边,而不是在 lib 文件夹中。解决方案非常简单。只需将 JPA 模块作为依赖项添加到 ear 模块的 POM 中。这样,您的 JPA 模块将成为您耳朵的 lib 文件夹中的一个 jar,然后您的 EJB 和 Web 模块可以在它们的 class 路径中找到 JPA 实体。添加依赖项后,构建您的项目并检查 ear lib 文件夹以确保您的 JPA 模块是它们的 jar。