2016-08-27 6 views
1

ich eine einfache Anwendung mit In Memory HSQLDB entwickelt habe und es läuft in Websphere Freiheit 8.5 über Windows-Profil. Jetzt habe ich solche Anwendung in Websphere über z/OS390 Mainframe (Unix) veröffentlicht und ich bekomme den Fehler unten.Fehler beim Erstellen der Bohne EntityManagerFactory, NoSuchMethodError: javax/Ausdauer/Table.indexes

Soweit es zu verstehen ist, sollte es nicht durch das Betriebssystem beeinflusst werden, da es das gleiche jar (hsqldb-2.3.2.jar), dieselbe JDK-Version (7) und genau dieselbe myapp.ear-Datei ist.

Also, meine direkte Frage ist: Was könnte der Grund für "NoSuchMethodError: javax/persistence/Table.indexes" während EntityManagerFactory Erstellung sein?

Was mein Leben schwerer zu machen, ist, dass genau das gleiche Ohr in meinem lokalen Websphere Einsatz nicht einen solchen Fehler nicht auftauchen. Eine indirekte Frage könnte sein, ist irgendeinen Trick im Speicher HSQLDB unter Unix zu machen? Lies ich die Logs falsch und dieser Fehler wird in der Tat durch eine falsche Spring-Konfiguration verursacht? Ich denke nicht, weil genau dasselbe Ohr in einer anderen Websphere läuft, wie gesagt.

Ich habe für 4 Tage zu kämpfen einen möglichen Grund zu finden, aber ich konnte nicht. Jeder Vorschlag wird sehr geschätzt.

Fehlerprotokolle:

WebSphere non-WLM Dispatch Thread t=009bb7a0¨ ContextLoader - Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' 
defined in myapp.config.root.TestConfiguration: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: javax/persistence/Table.indexes()ÝLjavax/persistence/Index; 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1566) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java 

TestConfiguration.java

@Configuration 
@EnableTransactionManagement 
public class TestConfiguration { 
    @Bean(initMethod = "init") 
    public TestDataInitializer initTestData() { 
     return new TestDataInitializer(); 
    } 

    @Bean(name = "datasource") 
    public DriverManagerDataSource dataSource() { 
     DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
     dataSource.setDriverClassName(org.hsqldb.jdbcDriver.class.getName()); 
     dataSource.setUrl("jdbc:hsqldb:mem:mydb"); 
     dataSource.setUsername("sa"); 
     dataSource.setPassword("jdbc:hsqldb:mem:mydb"); 

     System.out.println("Untill here was printed without error"); 

     return dataSource; 

    } 

    @Bean(name = "entityManagerFactory") 

    public LocalContainerEntityManagerFactoryBean entityManagerFactory(DriverManagerDataSource dataSource) { 

     LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean(); 
     entityManagerFactoryBean.setDataSource(dataSource); 
     entityManagerFactoryBean.setPackagesToScan(new String[]{"myapp.model"}); 

     entityManagerFactoryBean.setLoadTimeWeaver(new InstrumentationLoadTimeWeaver()); 
     entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); 

     Map<String, Object> jpaProperties = new HashMap<String, Object>(); 
     jpaProperties.put("hibernate.hbm2ddl.auto", "create"); 
     jpaProperties.put("hibernate.show_sql", "true"); 
     jpaProperties.put("hibernate.format_sql", "true"); 
     jpaProperties.put("hibernate.use_sql_comments", "true"); 
     entityManagerFactoryBean.setJpaPropertyMap(jpaProperties); 
     System.out.println("Untill here was printed without error also"); 

     return entityManagerFactoryBean; 
    } 
} 

TestDataInitializer

import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.hibernate.Transaction; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Component; 

import javax.persistence.EntityManagerFactory; 
@Component 
public class TestDataInitializer { 

     @Autowired 
     private EntityManagerFactory entityManagerFactory; 

     @Autowired 
     AnotherModelRepository anotherModelRepository; 

     public void init() throws Exception { 
       SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class); 

       Session session = sessionFactory.openSession(); 
       Transaction transaction = session.beginTransaction(); 

… few session.persit(mymodel)… 

POM:

<properties> 

       <java-version>1.7</java-version> 

       <org.springframework-version>4.1.3.RELEASE</org.springframework-version> 

       <spring-security-version>3.2.5.RELEASE</spring-security-version> 

       <hibernate.version>4.3.7.Final</hibernate.version> 

       <org.slf4j-version>1.6.1</org.slf4j-version> 

       <jackson-version>2.4.4</jackson-version> 

       <postgres.driver.version>9.3-1100-jdbc41</postgres.driver.version> 

     </properties> 





     <dependencies> 



       <!-- Spring --> 

       <dependency> 

        <groupId>org.springframework</groupId> 

        <artifactId>spring-context</artifactId> 

        <version>${org.springframework-version}</version> 

        <exclusions> 

          <!-- Exclude Commons Logging in favor of SLF4j --> 

          <exclusion> 

            <groupId>commons-logging</groupId> 

            <artifactId>commons-logging</artifactId> 

          </exclusion> 

        </exclusions> 

       </dependency> 



       <dependency> 

        <groupId>org.springframework</groupId> 

        <artifactId>spring-webmvc</artifactId> 

        <version>${org.springframework-version}</version> 

       </dependency> 



       <dependency> 

        <groupId>org.springframework</groupId> 

        <artifactId>spring-tx</artifactId> 

        <version>${org.springframework-version}</version> 

       </dependency> 



       <dependency> 

        <groupId>org.springframework</groupId> 

        <artifactId>spring-orm</artifactId> 

        <version>${org.springframework-version}</version> 

       </dependency> 



       <dependency> 

        <groupId>org.postgresql</groupId> 

        <artifactId>postgresql</artifactId> 

        <version>${postgres.driver.version}</version> 

       </dependency> 



       <dependency> 

        <groupId>org.springframework</groupId> 

        <artifactId>spring-test</artifactId> 

        <version>${org.springframework-version}</version> 

       </dependency> 



       <!-- Hibernate --> 

       <dependency> 

        <groupId>org.hibernate</groupId> 

        <artifactId>hibernate-core</artifactId> 

        <version>${hibernate.version}</version> 

       </dependency> 



       <dependency> 

        <groupId>org.hibernate</groupId> 

        <artifactId>hibernate-entitymanager</artifactId> 

        <version>${hibernate.version}</version> 

       </dependency> 



       <!-- Spring security --> 

       <dependency> 

        <groupId>org.springframework.security</groupId> 

        <artifactId>spring-security-core</artifactId> 

        <version>${spring-security-version}</version> 

       </dependency> 



       <dependency> 

        <groupId>org.springframework.security</groupId> 

        <artifactId>spring-security-web</artifactId> 

        <version>${spring-security-version}</version> 

       </dependency> 



       <dependency> 

        <groupId>org.springframework.security</groupId> 

        <artifactId>spring-security-config</artifactId> 

        <version>${spring-security-version}</version> 

       </dependency> 



       <dependency> 

        <groupId>com.allanditzel</groupId> 

        <artifactId>spring-security-csrf-token-filter</artifactId> 

        <version>1.1</version> 

       </dependency> 



       <!-- Logging --> 

       <dependency> 

        <groupId>org.slf4j</groupId> 

        <artifactId>slf4j-api</artifactId> 

        <version>${org.slf4j-version}</version> 

       </dependency> 

       <dependency> 

        <groupId>org.slf4j</groupId> 

        <artifactId>jcl-over-slf4j</artifactId> 

        <version>${org.slf4j-version}</version> 

        <scope>runtime</scope> 

       </dependency> 

       <dependency> 

        <groupId>org.slf4j</groupId> 

        <artifactId>slf4j-log4j12</artifactId> 

        <version>${org.slf4j-version}</version> 

        <scope>runtime</scope> 

       </dependency> 

       <dependency> 

        <groupId>log4j</groupId> 

        <artifactId>log4j</artifactId> 

        <version>1.2.16</version> 

       </dependency> 



       <!-- Jackson JSON Processor --> 

       <dependency> 

        <groupId>com.fasterxml.jackson.core</groupId> 

        <artifactId>jackson-databind</artifactId> 

        <version>${jackson-version}</version> 

       </dependency> 



       <!-- servlet container provided dependencies --> 

       <dependency> 

        <groupId>org.apache.tomcat</groupId> 

        <artifactId>tomcat-servlet-api</artifactId> 

        <version>7.0.30</version> 

        <scope>provided</scope> 

       </dependency> 



       <!-- test dependencies --> 

       <dependency> 

        <groupId>com.jayway.jsonpath</groupId> 

        <artifactId>json-path</artifactId> 

        <version>0.8.1</version> 

        <scope>test</scope> 

       </dependency> 



       <dependency> 

        <groupId>org.apache.commons</groupId> 

        <artifactId>commons-lang3</artifactId> 

        <version>3.3.2</version> 

       </dependency> 



       <dependency> 

        <groupId>junit</groupId> 

        <artifactId>junit</artifactId> 

        <version>4.12</version> 

        <scope>test</scope> 

       </dependency> 



       <dependency> 

        <groupId>org.hsqldb</groupId> 

        <artifactId>hsqldb</artifactId> 

        <version>2.3.2</version> 

       </dependency> 





     </dependencies> 



     <build> 

       <finalName>my-app</finalName> 



       <plugins> 

        <plugin> 

          <groupId>org.apache.maven.plugins</groupId> 

          <artifactId>maven-compiler-plugin</artifactId> 

          <version>2.3.2</version> 

          <configuration> 

            <source>${java-version}</source> 

            <target>${java-version}</target> 

          </configuration> 

        </plugin> 





        <plugin> 

          <groupId>org.apache.maven.plugins</groupId> 

          <artifactId>maven-war-plugin</artifactId> 

          <version>2.6</version> 

          <configuration> 

            <failOnMissingWebXml>false</failOnMissingWebXml> 

          </configuration> 

        </plugin> 





       </plugins> 

     </build> 

</project> 

**** Hinzugefügt in 28. August 2016 02.45 Uhr Brasilien, São Paulo Zeitzone Dank der hervorragenden Antworten zur Verfügung gestellt, ich finaly meine Anwendung in Windows Websphere 8.5 Liberty-Profil wie in Mainframe z/OS390 Websphere ND 8.5 ausgeführt haben. Ich habe hier meine Lösung für zukünftige Leser hinzugefügt. Der grundlegende Trick war (1), um Hibernate Herabstufung JPA2 verwenden und EntityManager.getDelegate()

@Component 

public class TestDataInitializer { 



     @Autowired 

     private EntityManagerFactory entityManagerFactory; 



     @Autowired 

     AnotherModelRepository anotherModelRepository; 



// I TOOK @PersistenceContext OUT 

/*  @PersistenceContext 

     private EntityManager em;*/ 



     public void init() throws Exception { 

//   I REPLACED entityManagerFactory.unwrap AND sessionFactory.openSession OUT 

       //SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class); 

//Session session = sessionFactory.openSession(); 



//   BY createEntityManager AND getDelegate 

       EntityManager em = entityManagerFactory.createEntityManager(); 

       Session session = (Session) em.getDelegate(); 

       Transaction transaction = session.beginTransaction(); 



… 



@Repository 

public class MyModelRepository { 

/*  @PersistenceContext 

     private EntityManager em;*/ 





     @Autowired 

     private EntityManagerFactory entityManagerFactory; 



     public MyModel findMyModelById(Long MyModel) { 

       EntityManager em = entityManagerFactory.createEntityManager(); 

       List<MyModel> MyModels = em.createNamedQuery(MyModel.FIND_BY_ID, MyModel.class).setParameter("MyModelId", MyModel).getResultList(); 



       return MyModels.size() == 1 ? MyModels.get(0) : null; 

     } 







     public List<MyModel> findOutByIn(Integer certainId){ 

       //SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class); 

       EntityManager em = entityManagerFactory.createEntityManager(); 

       Session session = (Session) em.getDelegate(); 



       String query = "select c from … c " 

        + " inner join … o " 

        + " where …; 



       //Session session = sessionFactory.openSession(); 

       Transaction transaction = session.beginTransaction(); 

       List<MyModel> l = session.createQuery(query).list(); 



     return l; 



     } 

Antwort

4

Sie unter Fehler.

Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: javax/persistence/Table.indexes()ÝLjavax/persistence/Index; 

Dieser Fehler zeigt an, dass die erforderliche Methode in der jeweiligen Klasse nicht verfügbar ist. Die Methode "indexes()" steht in der Klasse "javax.persistence.Table" von JPA 2.1 jar (Hibernate-jpa-2.1-api) zur Verfügung. Einige, wie in Ihrer Bereitstellung JPA 2.0 jar (Hibernate-JPA-2.0-API) abholen, die diese Methode nicht in der Klasse Tabelle hat. In Ihrer pom.xml verwenden Sie "Hibernate-entitymanager 4.3.7.Final", die JPA 2.1 JAR-Datei zur Verfügung stellt. Bitte suchen Sie nach der JPA 2.0-JAR-Datei in Ihrem Server, wo Sie diesen Fehler erhalten.

+0

versuchte ich hibernate.version 4.2.21, aber ich habe jetzt diese Fehlermeldung: „Die Methode unwrap (Klasse ) für den Typ EntityManagerFactory nicht definiert ist“. Was schlägst du mir vor? In wenigen Worten, ich möchte den folgenden Code auf Hibernate <4.3.x mit JPA 2.0 anpassen: "public void init() löst Exception {SessionFactory sessionFactory = entityManagerFactory.unwrap (SessionFactory.class); ..." Ich denke ich gerade muss "unwrap" in ??? ändern Methode. P.S. Ich las über Alternativen Websphere laufen mit JPA2.1 zu machen, aber ich ziehe mein Glas statt Herabstufung etwas in dem Unternehmen websphere –

+1

unwrap() -Methode möglicherweise nicht verfügbar mit Hibernate-JPA-2.0-api-1.0.1 jar ändern. Eine andere Möglichkeit, ein Session-Objekt zu erhalten, ist die EntityManager.getDelegate() -Methode.Bitte prüfe hier http://stackoverflow.com/questions/4148231/how-can-i-get-the-session-object-if-i-have-the-entitymanager – abaghel

+0

Als letzten Kritiker habe ich meine Lösung oben und hinzugefügt Ich frage mich, ob es wirklich eine gute Übung ist, da ich @Autowired EntityManagerFactory habe, aber ich habe die EntityManager-Implementierung über "entityManagerFactory.createEntityManager()" erstellt. Sie können von oben bemerken, dass ich "@PersistenceContext private EntityManager em" herausgenommen und "entityManagerFactory.createEntityManager()" hinzugefügt habe, wo immer ich die Session brauche. Nun, ich kann Ihnen sagen, dass es funktioniert, aber es klingt nicht komisch, dass ich die Factory autowired habe und ich eine "create" -Methode für die echte Implementierung verwendet habe? –

Verwandte Themen