Spring Data:不是托管类型:类java.lang.Object。

15

我昨天开始使用 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<T, ID extends Serializable> extends Repository<T, ID> {
    List<T> 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<Network, Long> baseRepository;

    @Test
    public void testAllNetworks() {
        final List<Network> networks = baseRepository.findAll();
        assertTrue(networks.isEmpty());
    }
}

我的pom.xml看起来像这样
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
    </dependency>
    <dependency>
        <groupId>org.hibernate.javax.persistence</groupId>
        <artifactId>hibernate-jpa-2.0-api</artifactId>
        <version>1.0.1.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>4.3.5.Final</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-jpa</artifactId>
        <version>1.6.0.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>joda-time</groupId>
        <artifactId>joda-time</artifactId>
    </dependency>
    <dependency>
        <groupId>com.google.code.findbugs</groupId>
        <artifactId>jsr305</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
    </dependency>
</dependencies>

当我运行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

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


我遇到“未管理的类”错误的原因之一是https://dev59.com/Ruo6XIcBkEYKwwoYOR0q#33608400。 - Ruraj
10个回答

42

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

interface NetworkRepository extends BaseRepository<Network, Long> { … }

你展示的代码中还有一些小问题:

  • Network 类没有任何带有 @Id 注解的属性。
  • BaseRepository 应该携带一个 @NoRepositoryBean 注解,以表明它根本不应该被实例化。有关详细信息,请参见参考文档

Oliver,你能帮我解决同样的异常吗?我正在迁移到Spring Data,我的repository如下:https://github.com/viniciuspires/reqlist/blob/master/src/main/java/org/reqlist/repository/ProjectRepository.java 这是我的实体:https://github.com/viniciuspires/reqlist/blob/master/src/main/java/org/reqlist/entity/Project.java 以及我的配置文件:https://github.com/viniciuspires/reqlist/blob/master/src/main/resources/META-INF/ 我一直得到java.lang.IllegalArgumentException: Not an managed type: class org.reqlist.entity.Project。你能帮我吗? - ViniciusPires
天啊,我忘记在我的存储库接口上加上那个"<EntityName, DataType>"了。花了几个小时试图解决这个问题,结果发现我漏掉了那个。 >.< 谢谢。 - iamjoshua
@NoRepositoryBean对我来说起了作用,谢谢你 - undefined

15
如果您有一个仓库接口继承了另一个接口,但是忘记在超级接口上添加@NoRepositoryBean,则也会发生此情况。

1
太完美了!这正是我的情况,并且非常有效。谢谢! - cristianoms
我不知道为什么我在文档中没有找到这个,而是在一个随机的SO答案中找到了它... 不管怎样,非常感谢! - Serhii

11

我曾经遇到了同样的问题,通过添加@NoRepositoryBean解决了这个问题。

@NoRepositoryBean
public interface BaseRespository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID> {}

4

由于my.package名称错误,我遇到了相同的错误。一旦我提供了正确的包名,它就可以正常工作。

@EnableJpaRepositories('my.package')


0
在我的情况下,我已经颠倒了CrudRepository的类型参数。也就是说,我写成了:
interface FooRepository extends CrudRepository<Long, Foo>

替代

interface FooRepository extends CrudRepository<Foo, Long>

0

尝试以下更改

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

0

尝试用你正在映射的类或模型的数据类型替换ID,这将是Integer,因此在JpaRepository<T,ID>中用Integer替换ID,即为JpaRepository<T,Integer>


0

我犯了以下错误:

在创建工厂时,我传递了 repo 包而不是 entity 包。


-1
另一个问题可能是由于忘记在您的类上注释 @Entity,因为这就是为什么Spring Boot将其视为未托管类型的原因。
当您对类进行注释后,它应该可以正常工作。但是,如果您收到以下错误:

Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]

然后确保你的类有以下注释的id:

 @Id
 @GeneratedValue(strategy = GenerationType.AUTO)

另一种可能的情况是Spring Boot无法检测到您的JPA或CrusRepository包。请确保您的主类使用以下注释进行注释:
@EnableJpaRepositories("Your-Package-Name-That-Includes-Your-Repository")

-1

我认为您在模型类上错过了@Entity注释

    @Entity
    class <classname>
    {
       //model variables   & getters Setters   

    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接