spring-data:不是托管类型:类java.lang.Object

我昨天开始使用spring-data项目,并试图将测试添加到我创建的存储库中。

项目结构看起来像

 persistence/pom.xml src/main/java/ ApplicationConfig BaseRepository Network src/main/test/BaseRepositoryTest 

ApplicationConfig看起来像

 @Configuration @ComponentScan @EnableJpaRepositories public class ApplicationConfig { @Bean public DataSource dataSource() { final EmbeddedDatabaseBuilder embeddedDatabaseBuilder = new EmbeddedDatabaseBuilder(); embeddedDatabaseBuilder.setType(EmbeddedDatabaseType.H2); return embeddedDatabaseBuilder.build(); } @Bean public LocalContainerEntityManagerFactoryBean entityManagerFactory() { final HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter(); jpaVendorAdapter.setDatabase(Database.H2); jpaVendorAdapter.setGenerateDdl(true); final LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean(); localContainerEntityManagerFactoryBean.setJpaVendorAdapter(jpaVendorAdapter); localContainerEntityManagerFactoryBean.setPackagesToScan(getClass().getPackage().getName()); localContainerEntityManagerFactoryBean.setDataSource(dataSource()); return localContainerEntityManagerFactoryBean; } } 

BaseRepository看起来像

 import org.springframework.data.repository.Repository; public interface BaseRepository extends Repository { List findAll(); } 

Network是一个实体类看起来像

 @Entity public class Network extends com.org.comma.persistence.Entity { private final long networkId; private final String name; private final boolean active; private final DateTime createdAt; private String createdBy; private DateTime updatedAt; private String updatedBy; ... } 

BaseRepositoryTest看起来像

 import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = {ApplicationConfig.class, BaseRepository.class}) public class BaseRepositoryTest { @Autowired BaseRepository baseRepository; @Test public void testAllNetworks() { final List networks = baseRepository.findAll(); assertTrue(networks.isEmpty()); } } 

我的pom.xml看起来像

   org.springframework spring-core   org.hibernate.javax.persistence hibernate-jpa-2.0-api 1.0.1.Final   org.hibernate hibernate-entitymanager 4.3.5.Final   org.springframework.data spring-data-jpa 1.6.0.RELEASE   joda-time joda-time   com.google.code.findbugs jsr305   org.springframework spring-test   junit junit test   com.h2database h2   

当我运行mvn clean install ,我看到错误为

 java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContext(CacheAwareContextLoaderDelegate.java:99) at org.springframework.test.context.DefaultTestContext.getApplicationContext(DefaultTestContext.java:101) at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:109) at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75) at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:319) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:212) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:232) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:89) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71) at org.junit.runners.ParentRunner.run(ParentRunner.java:236) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:175) at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252) at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141) at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189) at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165) at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85) at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115) at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75) Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'baseRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not an managed type: class java.lang.Object 

请帮助我确定我在这里做错了什么,我是这个项目的新手

存储库管理的类型必须在引导时知道,这意味着您需要实际创建一个具体的存储库,如下所示:

 interface NetworkRepository extends BaseRepository { … } 

您展示的代码中还有一些其他故障:

  • Network类没有任何使用@Id注释的属性
  • BaseRepository应该带有@NoRepositoryBean注释,以指示它根本不应该被实例化。 有关详细信息,请参阅参考文档

如果您有一个扩展另一个的存储库接口并且您忘记了超级接口上的@NoRepositoryBean,也会发生这种情况。

我遇到了同样的问题,并通过添加@NoRepositoryBean来解决

 @NoRepositoryBean public interface BaseRespository extends PagingAndSortingRepository {} 

由于my.package名称错误,我得到了同样的错误。 一旦我提供了正确的包装名称,它就可以正常使用。

@EnableJpaRepositories(’ my.package ‘)

请尝试以下更改

 @ContextConfiguration(classes = {ApplicationConfig.class, BaseRepository.class}, loader=AnnotationConfigContextLoader.class) 

我在做下面的错误:

在创建工厂时,我已经通过了repo包而不是实体包。