Spring Boot应用程序中的“IllegalArgumentException:不是托管类型”

50

我正在使用 Spring Boot 和 JPA。 它在这里

我的领域看起来像这样。 同时,似乎 Entity 注释已被弃用,所以我改用 @DynamicUpdate 代替。

@Data
@AllArgsConstructor
@NoArgsConstructor
@DynamicUpdate
public class Person {
    private String id;
    private String name;
}

我的@SpringBootApplication类看起来像这样

@SpringBootApplication
@ComponentScan("com.lapots.breed.platform.cloud.boot")
@EnableJpaRepositories("com.lapots.breed.platform.cloud.boot.repository")
@EntityScan("com.lapots.breed.platform.cloud.boot.domain")
public class JavaCloudSampleApplication {

    public static void main(String[] args) {
        SpringApplication.run(JavaCloudSampleApplication.class, args);
    }

    // executed after all beans instantiated
    @Bean
    public CommandLineRunner data(PersonRepository repository) {
        return (args) -> {
            repository.save(new Person(UUID.randomUUID().toString(), "Nike"));
        };
    }
}

@Repository 类的代码如下:

@Repository
public interface PersonRepository extends JpaRepository<Person, String> {
}

使用这个类的 @Service 看起来像这样

@Service
@Transactional
public class PersonService implements IPersonService {

    @Autowired
    private PersonRepository personRepository;

    @Override
    public Person findPerson(String id) {
        return personRepository.findOne(id);
    }

    @Override
    public Person generatePerson() {
        Person person = new Person();
        person.setId(UUID.randomUUID().toString());
        person.setName("Nike");
        return person;
    }
}

但是当我启动应用程序时,出现以下错误:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'personService': Unsatisfied dependency expressed through field 'personRepository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error
 creating bean with name 'personRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not a managed type: class com.lapots.breed.platform.cloud.boot.domain.Person
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:588) ~[spring-beans-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
        at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) ~[spring-beans-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366) ~[spring-beans-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264) ~[spring-beans-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553) ~[spring-beans-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) ~[spring-beans-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761) ~[spring-beans-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867) ~[spring-context-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543) ~[spring-context-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) ~[spring-boot-1.5.6.RELEASE.jar!/:1.5.6.RELEASE]
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693) [spring-boot-1.5.6.RELEASE.jar!/:1.5.6.RELEASE]
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360) [spring-boot-1.5.6.RELEASE.jar!/:1.5.6.RELEASE]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:303) [spring-boot-1.5.6.RELEASE.jar!/:1.5.6.RELEASE]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118) [spring-boot-1.5.6.RELEASE.jar!/:1.5.6.RELEASE]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107) [spring-boot-1.5.6.RELEASE.jar!/:1.5.6.RELEASE]
        at com.lapots.breed.platform.cloud.boot.app.JavaCloudSampleApplication.main(JavaCloudSampleApplication.java:23) [classes!/:0.0.1-SNAPSHOT]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_121]
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_121]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_121]
        at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.8.0_121]
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) [java-cloud-rest-api-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT]
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:87) [java-cloud-rest-api-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT]
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:50) [java-cloud-rest-api-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT]
        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51) [java-cloud-rest-api-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT]
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'personRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not a managed type: class com.lapots.breed.platform.cl
oud.boot.domain.Person
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628) ~[spring-beans-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) ~[spring-beans-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) ~[spring-beans-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
        at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:208) ~[spring-beans-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1138) ~[spring-beans-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066) ~[spring-beans-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585) ~[spring-beans-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
        ... 27 common frames omitted
Caused by: java.lang.IllegalArgumentException: Not a managed type: class com.lapots.breed.platform.cloud.boot.domain.Person
        at org.hibernate.jpa.internal.metamodel.MetamodelImpl.managedType(MetamodelImpl.java:210) ~[hibernate-entitymanager-5.0.12.Final.jar!/:5.0.12.Final]
        at org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformation.<init>(JpaMetamodelEntityInformation.java:70) ~[spring-data-jpa-1.11.6.RELEASE.jar!/:na]
        at org.springframework.data.jpa.repository.support.JpaEntityInformationSupport.getEntityInformation(JpaEntityInformationSupport.java:68) ~[spring-data-jpa-1.11.6.RELEASE.jar!/:na]
        at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getEntityInformation(JpaRepositoryFactory.java:153) ~[spring-data-jpa-1.11.6.RELEASE.jar!/:na]
        at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:100) ~[spring-data-jpa-1.11.6.RELEASE.jar!/:na]
        at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:82) ~[spring-data-jpa-1.11.6.RELEASE.jar!/:na]
        at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:199) ~[spring-data-commons-1.13.6.RELEASE.jar!/:na]
        at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.initAndReturn(RepositoryFactoryBeanSupport.java:277) ~[spring-data-commons-1.13.6.RELEASE.jar!/:na]
        at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:263) ~[spring-data-commons-1.13.6.RELEASE.jar!/:na]
        at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:101) ~[spring-data-jpa-1.11.6.RELEASE.jar!/:na]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687) ~[spring-beans-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624) ~[spring-beans-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
        ... 37 common frames omitted

问题是什么?


3
你在哪里找到 @Entity 已经被弃用的声明?因为“Not a managed type”基本上意味着缺少 @Entity - Florian Cramer
好的,hibernateentity 注解已经被弃用了,而不是 javax.persistence - lapots
但是Hibernate@Entity注释只是对JPA的扩展。因此,如果您将JPA添加到Person中,那么应该就没问题了。 - Florian Cramer
11个回答

68

也许由于您正在使用JPA,Person需要 Entity 注释。

@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
@DynamicUpdate
public class Person {
    private String id;
    private String name;
}

确实,缺少“Entity”类。因为某些原因,我排除了“javax.persistence”的引用,所以没有可用的“javax.persistence.Entity”。 - lapots
7
你需要在id字段上添加@Id注解。 - Hello World

21

对于那些使用 Spring Data 3并正在拼命搜索的人,我在进行了大量研究和尝试后意识到,大多数旧版建议适用于Spring Data的先前版本,而不适用于版本3.0.0。因此,我所有的尝试都失败了。我尝试过:

  • 添加一些注释(@EnableJpaRepositories,@ComponentScan,@EntityScan),包名中是否使用星号都可以。但是在程序开头仍然会出现Not a managed type: class […]致命错误。
  • 添加一个entityManagerFactory() bean,但我得到了一个循环引用错误。

最终,我发现了这个官方指南,其中给出了样例项目作为示例。这个项目使用了来自Jakarta的注解(例如: jakarta.persistence.Entity)而不是javax.persistence。有了Jakarta注解,我的项目就开始正常工作了。


感谢分享您的解决方案!将代码更改为 jakarta.persistence.Entity 也解决了我的错误。 - Stella
嗨,我改成了jakarta.persistence.Entity,但在本地构建时仍然遇到相同的错误。 - Shakeel Hussain
这让我在尝试了几个小时后有所帮助。谢谢。请注意,我还必须将@Id的导入更改为jakarta.persistence.Id。 - Kjeld
谢谢!还解决了我的错误。 - Adama Traore
这是什么鬼?为什么没有文档记录?这是一个重大变动,我在这上面花了好几个小时。 - Siraj Alam
我可以把一些啤酒,呃...高质量的牧场送给你吗?谢谢。我把每一个javax都替换成了jakarta,问题解决了。 - undefined

7
您需要在您的模型/POJO类中添加如下代码:@Entity。请确保按照上述格式进行添加。
@Entity
public class Person {
  //your model goes here
}

7
在Spring Boot中,你的仓库包(base names)的基础名称必须与你的实体(entity)包的基础名称匹配。
例如:
给定基础名称:
com.abc.mcm

实体包名称:
com.abc.mcm.entities 

软件包名称:

com.abc.mcm.repositories

回答中加入一个快速示例会更好。 - Adam Hughes
1
实际上对我有用。我一直在放置基础包而不是存储库所在的确切包。我这样做后,就不再出现这个错误了。 - Aspiring Dev

6

为那些将来会搜索的人编写:

LocalContainerEntityManagerFactoryBean中的实体管理器方法中,将包含DTO/POJO类的包设置为setPackagesToScan

示例:

@Bean
@Primary
public LocalContainerEntityManagerFactoryBean entityManagerFactory() throws Exception {
    LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
    em.setDataSource(dataSource());
    em.setPackagesToScan(new String[] {"com.abc.mainRepository.model"});
    HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
    em.setJpaVendorAdapter(vendorAdapter);
    HashMap<String, Object> properties = new HashMap<>();
    properties.put("hibernate.dialect", dialect);
    em.setJpaPropertyMap(properties);
    return em;
}

对我有效!

(我的POJO位于model包内)。


嗨,Kanika!我编辑了你的答案并添加了一些Markdown格式。您可以通过单击“已编辑”链接查看差异。如果您要在此网站上活跃,学习它是个好主意! - Lii
1
谢谢Lii,我很感激您所做的修改,使得内容更易于观看。 - Kanika Sharma
2
好的提示。在开发过程中,当@EntityScan@EnableJpaRepositories都包含一系列的包时,我遇到了同样的问题,只有其中一个被更新了。这样新的存储库就可以看到,但实体却不能被识别。 - user158037

4

虽然这个问题已经超过3年了,但我想告诉你一个对我有用的解决方案。

将所有的类/接口/存储库/模型等放在同一个包中。这将有效。


你是指相同的整体包或者是在同一个基础包中吗?也就是说,仓库、实体、接口都在完全相同的包中,比如com.sample.jpa? - Aspiring Dev

2
我在我的Spring Boot项目中遇到了同样的错误。 我添加了一个新的包,但我没有编辑componentScan。 就是这样,然后我就出现了错误:
com.okan.entity

我刚刚添加了以下内容,导致发生了变化:
com.okan.model.entity

1
在我的情况下,我有一个多Maven模块项目,其中之一是“model”包,其他是“microservices”。在我的情况下,当我运行使用 model package 中定义的类(在我的项目中称为域)的微服务时,必须将@EntityScan(basePackages = {"com.example.domain"})注释添加到@SpringBootApplication class中:
@SpringBootApplication
@EnableEurekaClient
@EntityScan(basePackages = {"com.example.domain"}) // add this so the spring boot context knows where to look after entities
public class DoctorServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(DoctorServiceApplication.class, args);
    }

}


1
import javax.persistence.Entity;

@Entity 添加到类中,它就会起作用。

0

你在 persistence.xml 中映射了实体吗?因为我之前也遇到了同样的错误,后来发现我没有在那里映射实体


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