Hibernate Spring数据JPA存储库:IllegalArgumentException此参数是必需的

Hibernate Spring数据JPA存储库:IllegalArgumentException此参数是必需的,hibernate,spring,jpa,maven,repository,Hibernate,Spring,Jpa,Maven,Repository,我正在尝试使用SpringDataJPA配置存储库。我在尝试执行测试时遇到以下异常。我可以让它工作,然后使用Maven编译,测试失败。然后我返回手动运行测试,测试失败(所有测试都没有更改任何代码)。我猜这可能是一个路径问题,但我已经从一个干净的项目开始,并继续有问题。我的例外是: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'personRepository': Fa

我正在尝试使用SpringDataJPA配置存储库。我在尝试执行测试时遇到以下异常。我可以让它工作,然后使用Maven编译,测试失败。然后我返回手动运行测试,测试失败(所有测试都没有更改任何代码)。我猜这可能是一个路径问题,但我已经从一个干净的项目开始,并继续有问题。我的例外是:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'personRepository': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: [Assertion failed] - this argument is required; it must not be null
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:149)
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:102)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1440)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:304)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:192)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:93)
    at com.vinoetic.vinoeticLibrary.util.ContextHelper.getContext(ContextHelper.java:15)
    at com.vinoetic.vinoeticLibrary.repository.TestPersonRepository.testRepository(TestPersonRepository.java:15)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at junit.framework.TestCase.runTest(TestCase.java:154)
    at junit.framework.TestCase.runBare(TestCase.java:127)
    at junit.framework.TestResult$1.protect(TestResult.java:106)
    at junit.framework.TestResult.runProtected(TestResult.java:124)
    at junit.framework.TestResult.run(TestResult.java:109)
    at junit.framework.TestCase.run(TestCase.java:118)
    at junit.framework.TestSuite.runTest(TestSuite.java:208)
    at junit.framework.TestSuite.run(TestSuite.java:203)
    at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.lang.IllegalArgumentException: [Assertion failed] - this argument is required; it must not be null
    at org.springframework.util.Assert.notNull(Assert.java:112)
    at org.springframework.util.Assert.notNull(Assert.java:123)
    at org.springframework.data.jpa.repository.support.SimpleJpaRepository.<init>(SimpleJpaRepository.java:74)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:94)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:69)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:131)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.java:114)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.java:38)
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:142)
    ... 29 more
[/code]
我的上下文设置是:

<bean id="mySessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="vinoeticDataSource_MySQL" />
    <property name="hibernateProperties">
        <value>
            hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
        </value>
    </property>
</bean>

<bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="vinoeticDataSource_MySQL" />
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />


<!-- JPA -->
<jpa:repositories base-package="com.vinoetic.interfacesAndModels.repositories.sql"
    entity-manager-factory-ref="emf1" transaction-manager-ref="transactionManager" />

<bean id="emf1"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="vinoeticDataSource_MySQL" />
    <property name="persistenceUnitName" value="persistenceUnit" />
    <property name="loadTimeWeaver">
        <bean
            class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
    </property>
</bean>

hibernate.dialogue=org.hibernate.dialogue.mysql5innodbdialogue
最后,我的persistence.xml是:

<persistence    xmlns="http://java.sun.com/xml/ns/persistence" 
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                version="2.0" 
                xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
    </persistence-unit>
</persistence>

org.hibernate.ejb.HibernatePersistence
我已经花了三天的时间在这上面了,我似乎无法让它一直工作下去。正如我提到的,我可以让它工作,但是如果我使用maven编译,我的测试就会失败。然后在Eclipse中重新运行我的测试,它们会失败,出现上述异常

我看过这里的其他帖子并尝试了这些建议。我提到:

我尝试了他们推荐的方法,但随后出现了一个错误,即没有持久性提供程序。我似乎无法让任何东西始终如一地发挥作用

使用:

STS 2.8.0.1版本 JDK1.6


谢谢你的帮助。

我偶然发现了这个问题,因为我遇到了同样的问题

我发现,如果我:

  • 创建了一个单独的
    ApplicationContext
    ,用于提供存储库的测试目的
  • 介绍了使用
    @ContextConfiguration
    注释与文本一起使用的
    ApplicationContext
  • 为存储库创建一个类属性,然后用
    @Inject
  • 我发现“”是无价的


    我希望这能帮助一些人——我知道这是一条非常古老的线索,但Google+StackOverFlow=happy smiley faces可能会在2015年的某个时候出现

    您使用的是哪个版本的Spring data jpa?建议解决方案中提到的问题要求您列出persistence.xml中的所有实体类-而不是像上面那样添加提供程序。另一个尝试是使用straight jpa进行测试-将EntityManager注入junit测试,看看是否可以使用它查询实体。这很可能是由于错误的JPA配置导致的问题,该配置显示为spring数据错误。
    @Entity
    @Table(name="PERSON")
    @ToString(includeFieldNames=true)
    @Data public class Person {
    
        @Id
        private Long personId = null;
        private Long userId = null;
        private String lastName = null;
        private String firstName = null;
        private String email = null;
        private String phoneHome = null;
        private String phoneCell = null;
        private String phoneWork = null;
        private Date birthdate = null;
        private String namePrefix = null;
        private String title = null;
        @Column(columnDefinition="tinyint")
        private Boolean sendNewsletter = false;
        private String facebookURL = null;
        private String profileImageURL = null;
    
        @Transient
        private UserProfileImage profileImages = null;
    
    
    }
    
    <bean id="mySessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="vinoeticDataSource_MySQL" />
        <property name="hibernateProperties">
            <value>
                hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
            </value>
        </property>
    </bean>
    
    <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="vinoeticDataSource_MySQL" />
    </bean>
    
    <tx:annotation-driven transaction-manager="transactionManager" />
    
    
    <!-- JPA -->
    <jpa:repositories base-package="com.vinoetic.interfacesAndModels.repositories.sql"
        entity-manager-factory-ref="emf1" transaction-manager-ref="transactionManager" />
    
    <bean id="emf1"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="vinoeticDataSource_MySQL" />
        <property name="persistenceUnitName" value="persistenceUnit" />
        <property name="loadTimeWeaver">
            <bean
                class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
        </property>
    </bean>
    
    <persistence    xmlns="http://java.sun.com/xml/ns/persistence" 
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                    version="2.0" 
                    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
        <persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL">
            <provider>org.hibernate.ejb.HibernatePersistence</provider>
        </persistence-unit>
    </persistence>