2014-03-29 7 views
14

Ich versuche, eine Java-SE-Anwendung mit Spring Data + Hibernate zu starten und haben die follwowing bis jetzt getan:Java SE + Spring Data + Hibernate

Konfigurationsdatei

@Configuration 
@PropertySource("classpath:hibernate.properties") 
@EnableJpaRepositories 
@EnableTransactionManagement 
public class JpaConfiguration { 

    private static final String PROPERTY_NAME_DATABASE_DRIVER = "db.driver"; 
    private static final String PROPERTY_NAME_DATABASE_PASSWORD = "db.password"; 
    private static final String PROPERTY_NAME_DATABASE_URL = "db.url"; 
    private static final String PROPERTY_NAME_DATABASE_USERNAME = "db.username"; 

    private static final String PROPERTY_NAME_HIBERNATE_DIALECT = "hibernate.dialect"; 
    private static final String PROPERTY_NAME_HIBERNATE_SHOW_SQL = "hibernate.show_sql"; 
    private static final String PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN = 
      "entitymanager.packages.to.scan"; 

    @Resource 
    private Environment env; 

    @Bean 
    public DataSource dataSource() { 
     DriverManagerDataSource dataSource = new DriverManagerDataSource(); 

     dataSource.setDriverClassName(
       env.getRequiredProperty(PROPERTY_NAME_DATABASE_DRIVER)); 
     dataSource.setUrl(env.getRequiredProperty(PROPERTY_NAME_DATABASE_URL)); 
     dataSource.setUsername(env.getRequiredProperty(PROPERTY_NAME_DATABASE_USERNAME)); 
     dataSource.setPassword(env.getRequiredProperty(PROPERTY_NAME_DATABASE_PASSWORD)); 

     return dataSource; 
    } 

    @Bean 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 
     LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new 
       LocalContainerEntityManagerFactoryBean(); 
     entityManagerFactoryBean.setDataSource(dataSource()); 
     entityManagerFactoryBean.setPersistenceProviderClass(org.hibernate 
       .jpa.HibernatePersistenceProvider.class); 
     entityManagerFactoryBean.setPackagesToScan(env. 
       getRequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN)); 

     entityManagerFactoryBean.setJpaProperties(hibProperties()); 

     return entityManagerFactoryBean; 
    } 

    private Properties hibProperties() { 
     Properties properties = new Properties(); 
     properties.put(PROPERTY_NAME_HIBERNATE_DIALECT, 
       env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_DIALECT)); 
     properties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL, 
       env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL)); 
     return properties; 
    } 

    @Bean 
    public JpaTransactionManager transactionManager() { 
     JpaTransactionManager transactionManager = new JpaTransactionManager(); 
     transactionManager.setEntityManagerFactory(entityManagerFactory().getObject()); 
     return transactionManager; 
    } 

    @Bean 
    public MainBean mainBean() { 
     return new MainBean(); 
    } 
} 

Startklasse

public class Start { 


    private static final String CONFIG_PACKAGE = "org.app.config"; 


    public static void main(String[] args) { 

     try (AnnotationConfigApplicationContext ctx = new 
       AnnotationConfigApplicationContext()) { 

      ctx.scan(CONFIG_PACKAGE); 
      ctx.refresh(); 

      MainBean bean = ctx.getBean(MainBean.class); 
      bean.start(); 
     } 
    } 
} 

Haupt Bean

public class MainBean { 

     public void start() { 

     System.out.println("Application Started. . ."); 


    } 

} 

aber ich erhalte die folgende Ausnahme

Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: file [C:\MyPath\target\classes\org\app\config\JpaConfiguration.class]; nested exception is java.lang.IllegalArgumentException 
    at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:281) 
    at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:242) 
    at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.scan(ClassPathBeanDefinitionScanner.java:220) 
    at org.springframework.context.annotation.AnnotationConfigApplicationContext.scan(AnnotationConfigApplicationContext.java:153) 
    at org.app.Start.main(Start.java:25) 
Caused by: java.lang.IllegalArgumentException 
    at org.springframework.asm.ClassReader.<init>(Unknown Source) 
    at org.springframework.asm.ClassReader.<init>(Unknown Source) 
    at org.springframework.asm.ClassReader.<init>(Unknown Source) 
    at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:52) 
    at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:80) 
    at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:101) 
    at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:257) 
    ... 4 more 

jemand eine Idee, was ich falsch mache?

+1

https://jira.spring.io/browse/SPR-10292 – axtavt

+1

Überprüfen Sie Spring Boot, es wird Ihnen helfen, fast die gesamte Konfiguration zu beseitigen, die Sie haben, und importieren Sie auch die richtigen Versionen der Abhängigkeiten http: // Feder .io/guides/gs/accessing-daten-jpa/ – geoand

Antwort

43

Die angezeigte Ausnahme ist wahrscheinlich nicht auf eine ungültige Spring-Konfiguration zurückzuführen, sondern auf die Einrichtung des Klassenpfads. Dies fühlt sich an wie eine Versionsinkompatibilität bezüglich der ASM-Bibliotheken und Java 8. Die ASM-Version, von der Spring 3.2 abhängt, ist bekanntermaßen mit Java 8 inkompatibel.

Wenn Sie also Ihren Code mit Java 8 ausführen möchten, müssen Sie Verwenden Sie eine aktuelle Version von Spring 4.0.

+0

Vielen Dank! Ich habe mehrere Stunden verschwendet, dieses Problem zu lösen – avrilfanomar

8

Ich hatte auch das gleiche Problem mit Spring-3.2.0 und Java 8 (jdk1.8.0_60). Nach 3.2.14 Release Federrahmen funktioniert es.

+0

Eigentlich, wenn das OP tatsächlich ein Java8-bezogenes Problem konfrontiert, ist diese Antwort die richtige Antwort, um Spring 3.2 arbeiten auf Java8 zu bekommen, ein Upgrade auf die neueste Version macht es ohne Änderungen funktioniert. –

Verwandte Themen