Пример TOMEE jpa-eclipselink не работает

Пример TOMEE jpa-eclipselink:

https://github.com/apache/tomee/tree/trunk/examples/jpa-eclipselink

У МЕНЯ НЕ РАБОТАЕТ

EJBContainer.createEJBContainer(p) внутри класса модульного теста (MoviesTest) завершился со следующим исключением:

...
INFO - Found EjbModule in classpath: c:\users\oren\projects\test\jpa-eclipselink\target\classes
INFO - Beginning load: c:\users\oren\projects\test\jpa-eclipselink\target\classes
INFO - Configuring enterprise application: C:\Users\Oren\Projects\Test\jpa-eclipselink
INFO - Closing DataSource: movieDatabase

java.lang.NoSuchMethodError: javax.ejb.Stateful.passivationCapable()Z
    at org.apache.openejb.config.AnnotationDeployer$DiscoverAnnotatedBeans.deploy(AnnotationDeployer.java:1454)
    at org.apache.openejb.config.AnnotationDeployer$DiscoverAnnotatedBeans.deploy(AnnotationDeployer.java:456)
    at org.apache.openejb.config.AnnotationDeployer.deploy(AnnotationDeployer.java:371)
    at org.apache.openejb.config.ConfigurationFactory$Chain.deploy(ConfigurationFactory.java:415)
    at org.apache.openejb.config.ConfigurationFactory.configureApplication(ConfigurationFactory.java:1002)
    at org.apache.openejb.OpenEjbContainer$Provider.createEJBContainer(OpenEjbContainer.java:321)
    at javax.ejb.embeddable.EJBContainer.createEJBContainer(EJBContainer.java:56)
    at org.superbiz.eclipselink.MoviesTest.test(MoviesTest.java:37)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:86)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

Я попытался найти в Google java.lang.NoSuchMethodError: javax.ejb.Stateful.passivationCapable, но не нашел никакой подсказки.

Единственное изменение, которое я внес в пример проекта maven:

<dependency>
  <groupId>org.apache.openejb</groupId>
  <artifactId>javaee-api</artifactId>
  <version>6.0-6</version>
  <scope>provided</scope>
</dependency>

вместо:

<dependency> 
 <groupId>org.apache.openejb</groupId> 
 <artifactId>javaee-api</artifactId> 
 <version>7.0-SNAPSHOT</version> 
 <scope>provided</scope> 
</dependency> 

потому что первый не стал бы строить.

Может ли кто-нибудь объяснить, в чем проблема, я уже провел несколько часов без успеха.

Наилучшие пожелания


person codor    schedule 30.12.2015    source источник
comment
Ничего общего с EclipseLink или JPA ... это чисто EJB (openejb), как показывает трассировка стека.   -  person Neil Stockton    schedule 30.12.2015


Ответы (3)


Если вы не смогли выполнить сборку с помощью JavaEE 6.0.6, я дам вам настройки, которые я могу СОЗДАТЬ и ЗАПУСТИТЬ с помощью eclipselink, TomEE 1.7.2, Mysql.

На самом деле, я пытался сделать то же самое, что и вы (для меня это заняло пару дней), и несколько минут назад мне наконец удалось запустить свое приложение с помощью eclipselink!! Ура!

Вот как выглядит мой pom.xml:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

    <!-- some of my project settings here -->

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <build>
        <finalName>myprojectname</finalName>
        <plugins>
            <plugin>
                <!-- org.apache.maven.plugins 3.3 for source v1.8 -->
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <releases>
                <enabled>false</enabled>
            </releases>
            <snapshots/>
            <id>apache-maven-snapshots</id>
            <url>https://repository.apache.org/content/groups/snapshots</url>
        </repository>
        <repository>
            <id>eclipselink-repo</id>
            <name>EclipseLink Repository</name>
            <url>http://www.eclipse.org/downloads/download.php?r=1&amp;nf=1&amp;file=/rt/eclipselink/maven.repo</url>
        </repository>
    </repositories>

    <dependencies>

        <!-- mojarra required for facesmessage on ViewExpiredException -->
        <dependency>
            <groupId>org.glassfish</groupId>
            <artifactId>javax.faces</artifactId>
                <version>2.2.12</version>
        </dependency>
        <!-- /mojarra -->

        <!-- db connection required -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>
        <!-- /db connection -->

        <!-- JavaEE required -->
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>7.0</version>
            <scope>provided</scope>
        </dependency>
        <!-- /JavaEE -->

        <!-- OmniFaces required for JSF, @Eager, postback same request parameters, etc -->
        <dependency>
            <groupId>org.omnifaces</groupId>
            <artifactId>omnifaces</artifactId>
            <version>1.8.3</version>
        </dependency>
        <!-- /OmniFaces -->

        <!-- some commons-io, commons-lang3, jackson, velocity, aws sdks not relevant i guess. -->

        <!-- even thought this is in the tomee eclipselink sample, it is not required -->
        <!--
        <dependency>
            <groupId>org.apache.openejb</groupId>
            <artifactId>javaee-api</artifactId>
            <version>6.0-6</version>
        </dependency>
        -->

        <!-- openejb container -->
        <dependency>
            <groupId>org.apache.openejb</groupId>
            <artifactId>openejb-core</artifactId>
            <version>4.7.2</version>
            <scope>provided</scope>
        </dependency>

        <!-- toplink dependencies -->
        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>eclipselink</artifactId>
            <version>2.4.2</version>
        </dependency>

    </dependencies>

    <!-- <distributionManagement> section , i guess not relevant either. -->

</project>

и мой файл persistence.xml выглядит так:

<?xml version="1.0" encoding="UTF-8" ?>
<persistence version="1.0"
             xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
    <persistence-unit name="myprojectname-persistence-unit" transaction-type="JTA">
        <jta-data-source>myprojectname-mysql-jdbc-jta-resource</jta-data-source>
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <properties>
            <property name="eclipselink.target-database" value="org.eclipse.persistence.platform.database.MySQLPlatform"/>
        </properties>
    </persistence-unit>
</persistence>

и мой менеджер объектов:

public abstract class BaseDao {

    @PersistenceContext(unitName = "myprojectname-persistence-unit", type = PersistenceContextType.EXTENDED)
    protected EntityManager em;

}

и мои ресурсы.xml:

<Resource id="myprojectname-mysql-jdbc-jta-resource" type="javax.sql.DataSource">
    jtaManaged = true
    DataSourceCreator = tomcat
    validationQuery = SELECT 1
    initialSize = 2
    removeAbandoned = true
    removeAbandonedTimeout = 120
    driverClassName = com.mysql.jdbc.Driver
    url = jdbc:mysql://localhost/myprojectdb
    UserName = usernamestring
    password = passwordstring
    testOnBorrow = true
</Resource>

Обратите внимание, что в моем pom.xml я удалил тест, потому что я хочу, чтобы они были не только для теста, но и для продукта.

Я установил для артефакта openejb-core значение <version>4.7.2</version> И <scope>provided</scope>, потому что нашел эту версию в каталоге tomEE-home(v1.7.2)/lib. Версия openejb-core отличается, если версия tomEE отличается.

EDIT: openEJB javaee-api не требовался в pom.xml, поэтому я закомментировал его. Кроме того, EclipseLink 2.6.2 не был ПОЛНОСТЬЮ совместим, поэтому я изменил его на 2.4.2. См.: Почему мой кэш результатов запроса EclipseLink НЕ работает

person Hirofumi Okino    schedule 30.12.2015
comment
Спасибо за ваши усилия, чтобы предоставить решение - person codor; 31.12.2015

Если вы посмотрите JEE7-javadocs для javax.ejb.Stateful.passivationCapable, вы найдете

С: EJB 3.2

Таким образом, этот метод был представлен только в JEE7, поскольку JEE6 использовала EJB 3.1.

Версия eclipselink, которую вы используете, похоже, нуждается в реализации JEE7 (поэтому они помещают ее в свой список зависимостей) и не будет работать с JEE6.

person piet.t    schedule 30.12.2015
comment
Спасибо, вы решили мою проблему, я не понял, что 6.0-6 означает JEE6 - person codor; 30.12.2015

Как любезно предложил Хирофуми Окино, используйте следующие зависимости:

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version>7.0</version>
    <scope>provided</scope>
</dependency>

<dependency>
    <groupId>org.apache.openejb</groupId>
    <artifactId>openejb-core</artifactId>
    <version>4.7.2</version>
    <scope>provided</scope>
</dependency>

и пример будет работать без 7.0-SNAPSHOT

person codor    schedule 31.12.2015