2015-11-10 2 views
1

У меня есть проект Maven с 4 модулями: модуль JPA с persistence.xml, EJB-модулем, модулем Webapp и модулем EAR.Модуль EJB не может достичь объектов JPA

Я использую модуль 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> 

У меня есть модуль JPA в мой EJB pom.xml

Что я делаю неправильно?

+0

JAR-файл, представляющий модуль JPA, должен быть в папке '/ lib' EAR. Это подтверждается, когда вы позволяете maven создавать файл EAR, а затем проверять его содержимое? Исключение предполагает, что это не так. – BalusC

ответ

1

Ваш EJB не может найти классы объектов, потому что если вы откроете свой файл уха после сборки, вы обнаружите, что ваш модуль JPA сидит рядом с модулем EJB, а не в папке lib. Решение довольно простое. Просто добавьте свой JPA-модуль в зависимость от POM вашего модуля уха. Таким образом, ваш модуль JPA будет банком в папке lib вашего уха, тогда ваши EJB и веб-модули могут найти enaites JPA в своем классе. После того, как вы добавите зависимость, создайте свой проект и сделайте чек в папке уха, чтобы убедиться, что ваш модуль JPA является их банкой.

0

При использовании WildFly у вас обычно нет необходимости использовать EAR-упаковку, а вместо этого помещает все в WAR, в результате чего у вас нет разных загрузчиков классов, что может решить проблему для вас.

Отъезд Adam Bien's example для проекта на основе maven с использованием WAR-упаковки - он не использует модуль JPA, но я думаю, вы поймете эту идею.

Смежные вопросы