2016-07-05 2 views
2

Я пытаюсь настроить Hibernate, Spring Data JPA для MySQL. Я был бы очень признателен, если бы кто-нибудь мог указать, что мне не хватает? Кроме того, мне не удалось найти причину IllegalArgumentException.Ошибка создания бина

2016-07-05 19:07:06.677 INFO 7760 --- [   main] o.s.j.d.DriverManagerDataSource   : Loaded JDBC driver: com.mysql.jdbc.Driver 
    file:/C:/Users/eprisur/.gradle/caches/modules-2/files-2.1/org.hibernate.javax.persistence/hibernate-jpa-2.1-api/1.0.0.Final/5e731d961297e5a07290bfaf3db1fbc8bbbf405a/hibernate-jpa-2.1-api-1.0.0.Final.jar 
    2016-07-05 19:07:06.799 WARN 7760 --- [   main] ationConfigEmbeddedWebApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [com/test/authflow/config/DatabaseConfig.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Class name must not be null 
    2016-07-05 19:07:06.810 INFO 7760 --- [   main] o.apache.catalina.core.StandardService : Stopping service Tomcat 
    2016-07-05 19:07:06.822 ERROR 7760 --- [   main] o.s.boot.SpringApplication    : Application startup failed 

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [com/test/authflow/config/DatabaseConfig.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Class name must not be null 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
     at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
     at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
     at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
     at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1054) ~[spring-context-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
     at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:829) ~[spring-context-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
     at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538) ~[spring-context-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
     at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118) ~[spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE] 
     at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:766) [spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE] 
     at org.springframework.boot.SpringApplication.createAndRefreshContext(SpringApplication.java:361) [spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE] 
     at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) [spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE] 
     at org.springframework.boot.SpringApplication.run(SpringApplication.java:1191) [spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE] 
     at org.springframework.boot.SpringApplication.run(SpringApplication.java:1180) [spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE] 
     at com.test.authflow.LoginSystemApplication.main(LoginSystemApplication.java:11) [bin/:na] 
    Caused by: java.lang.IllegalArgumentException: Class name must not be null 
     at org.springframework.util.Assert.notNull(Assert.java:115) ~[spring-core-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
     at org.springframework.util.ClassUtils.convertClassNameToResourcePath(ClassUtils.java:960) ~[spring-core-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
     at org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.buildDefaultPersistenceUnitInfo(DefaultPersistenceUnitManager.java:522) ~[spring-orm-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
     at org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.readPersistenceUnitInfos(DefaultPersistenceUnitManager.java:503) ~[spring-orm-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
     at org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.preparePersistenceUnitInfos(DefaultPersistenceUnitManager.java:440) ~[spring-orm-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
     at org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.afterPropertiesSet(DefaultPersistenceUnitManager.java:424) ~[spring-orm-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
     at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:310) ~[spring-orm-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
     at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:319) ~[spring-orm-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574) ~[spring-beans-4.2.5.RELEASE.jar:4.2.5.RELEASE] 


    2016-07-05 19:07:06.825 WARN 7760 --- [   main] o.s.boot.SpringApplication    : Error handling failed (Error creating bean with name 'delegatingApplicationListener' defined in class path resource [org/springframework/security/config/annotation/web/configuration/WebSecurityConfiguration.class]: BeanPostProcessor before instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration': Initialization of bean failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'org.springframework.context.annotation.ConfigurationClassPostProcessor.importRegistry' is defined) 

Мой build.gradle выглядит следующим образом:

buildscript { 
    ext { springBootVersion = '1.3.3.RELEASE' } 
     repositories { 
       mavenCentral() 
        maven { url "https://repo.spring.io/snapshot" } 
        maven { url "https://repo.spring.io/milestone" } 
        } 
     dependencies { 
       classpath("org.springframework.boot:spring-boot-gradle plugin:${springBootVersion}")  

      } 
       } 

apply plugin: 'java'    
apply plugin: 'eclipse-wtp'   
apply plugin: 'spring-boot'   


    jar { 
     manifest { 
     attributes 'Main-Class': 'com.test.authflow.LoginSystemApplication' 
       } 
     } 

     sourceCompatibility = 1.8   
     targetCompatibility = 1.8 

     repositories { 
      mavenCentral() 
      maven { url "https://repo.spring.io/snapshot" } 
      maven { url "https://repo.spring.io/milestone" } 
         } 

      configurations { 
        providedRuntime 

        } 

     configurations { 
       runtime.exclude group: "org.slf4j", module: "slf4j-simple" 
       compile.exclude group: "org.slf4j", module: "slf4j-simple" 

         } 

     dependencies { 

        //for external container 
     providedRuntime("org.springframework.boot:spring-boot-starter-tomcat") 
      providedRuntime("org.apache.tomcat:tomcat-juli") 
      providedRuntime("org.apache.tomcat:tomcat-jdbc") 



      } 

      ext['hibernate.version'] = '5.2.1.Final' 

     dependencies { 
      compile ('org.springframework.boot:spring-boot-starter') 
      compile("org.springframework.boot:spring-boot-starter-web") 
      compile("org.springframework.boot:spring-boot-starter-data-jpa") 
      compile("org.springframework.boot:spring-boot-starter-security") 
      compile("mysql:mysql-connector-java") 
        } 
      task wrapper(type: Wrapper) { 
       gradleVersion = '2.13' 
       } 

Это мой DatabaseConfig класс:

package com.test.authflow.config; 


import java.util.Properties; 
import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory; 
import javax.sql.DataSource; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.PropertySource; 
import org.springframework.core.env.Environment; 
import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor; 
import org.springframework.jdbc.datasource.DriverManagerDataSource; 
import org.springframework.orm.jpa.JpaTransactionManager; 
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; 
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; 
import org.springframework.transaction.PlatformTransactionManager; 
import org.springframework.transaction.annotation.EnableTransactionManagement; 



@Configuration 
@PropertySource(value = { "application.properties" }) 
@EnableTransactionManagement 
public class DatabaseConfig { 

@Bean 
public DataSource dataSource() 
{ 
    DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
    dataSource.setDriverClassName(env.getProperty("db.driver")); 
    dataSource.setUrl(env.getProperty("db.url")); 
    dataSource.setUsername(env.getProperty("db.username")); 
    dataSource.setPassword(env.getProperty("db.password")); 
    return dataSource; 
} 




@Bean 
public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 
    LocalContainerEntityManagerFactoryBean em = 
      new LocalContainerEntityManagerFactoryBean(); 

    em.setDataSource(dataSource()); 

    // Classpath scanning of @Component, @Service, etc annotated class 
    em.setPackagesToScan(
      env.getProperty("em.setPackagesToScan")); 

    //Vendor Adapter 
    HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); 
    em.setJpaVendorAdapter(vendorAdapter); 

    //Hibernate Properties 
    Properties additionalProperties = new Properties(); 
    additionalProperties.put(
      "hibernate.dialect", 
      env.getProperty("hibernate.dialect")); 
    additionalProperties.put(
      "hibernate.show_sql", 
      env.getProperty("hibernate.dialect")); 
    additionalProperties.put(
      "hibernate.hbm2ddl.auto", 
      env.getProperty("hibernate.hbm2ddl.auto")); 
    em.setJpaProperties(additionalProperties); 

    System.out.println(EntityManager.class.getProtectionDomain() 
      .getCodeSource() 
      .getLocation()); 

    return em; 
} 


@Bean 
public PlatformTransactionManager transactionManager(EntityManagerFactory emf) { 
    JpaTransactionManager transactionManager = 
      new JpaTransactionManager(); 
    transactionManager.setEntityManagerFactory(emf); 
    return transactionManager; 

} 


public PersistenceExceptionTranslationPostProcessor ExceptionTranslation() { 
    return new PersistenceExceptionTranslationPostProcessor(); 
} 



@Autowired 
private Environment env; 


} 
+0

Учитывая, что вы используете Spring бутс, что цель 'DatabaseConfig'? Spring Boot автоматически настроит все для вас. Вы пытаетесь каким-то образом настроить поведение загрузки по умолчанию? –

+0

Спасибо @ Энди Уилкинсон. Я осознал свою ошибку. – Sp1

ответ

1

Согласие на DefaultPersistenceUnitManager.java: линия 522 Проблема заключается в том, что вы Ждут» t установить packagesToScan

for (String pkg : this.packagesToScan) { 
 
\t \t \t \t try { 
 
\t \t \t \t \t String pattern = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + 
 
\t \t \t \t \t \t \t ClassUtils.convertClassNameToResourcePath(pkg) + CLASS_RESOURCE_PATTERN;

public static String convertClassNameToResourcePath(String className) { 
    Assert.notNull(className, "Class name must not be null"); 
    return className.replace(PACKAGE_SEPARATOR, PATH_SEPARATOR); 
} 

Таким образом, вы можете проверить вам код в em.setPackagesToScan (env.getProperty ("em.setPackagesToScan"));

env.getProperty ("em.setPackagesToScan") равно нулю;

+0

Спасибо @ H.Hao. Это было очень полезно. Хотя, я изменил файл application.properties и использовал spring.datasource. * И spring.jpa. * Свойства из [link] (http://docs.spring.io/spring-boot/docs/current/reference/html /common-application-properties.html) и удалил 'DatabaseConfig' – Sp1

0

вы можете иметь класс Java в ваш пакет, который не является JPA/Entity

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