Spring Boot JPA应用启动报错:实体类非托管类型
问题排查:Spring Boot启动报错“Not a managed type: class com.d043114.minimalJPA.City”
核心错误原因
主类中@EntityScan注解的包名存在拼写错误:com.d043114.minimlaJPA应为com.d043114.minimalJPA,导致Spring无法扫描到City实体类,触发“Not a managed type”异常。
此外代码中还有其他需要修复的问题,逐一说明如下:
问题修复步骤
1. 修正实体扫描包名
修改主类中的@EntityScan注解,修正拼写错误:
@EntityScan("com.d043114.minimalJPA")
2. 正确获取Spring应用上下文
main方法中直接使用appcontext但未定义,需接收SpringApplication.run()的返回值:
ConfigurableApplicationContext appcontext = SpringApplication.run(MinimalJpaApplication.class, args);
3. 补充实体类缺失字段
City类中未定义isCapital字段,但代码中调用了setIsCapital(),需添加对应字段及getter/setter:
private boolean isCapital; public boolean isCapital() { return isCapital; } public void setCapital(boolean capital) { isCapital = capital; }
4. 移除冗余注解
@SpringBootApplication已默认包含@ComponentScan(扫描主类所在包及子包),无需额外添加@ComponentScan(basePackages = "com.d043114.minimalJPA"),可直接删除。
修正后完整代码
主类MinimalJpaApplication.java
package com.d043114.minimalJPA; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.domain.EntityScan; import org.springframework.context.ConfigurableApplicationContext; @SpringBootApplication @EntityScan("com.d043114.minimalJPA") public class MinimalJpaApplication { public static void main(String[] args) { ConfigurableApplicationContext appcontext = SpringApplication.run(MinimalJpaApplication.class, args); City berlin = new City(); berlin.setName("Berlin"); berlin.setCapital(true); City duesseldorf = new City(); duesseldorf.setName("Düsseldorf"); duesseldorf.setCapital(false); CityRepository cityRepository = appcontext.getBean(CityRepository.class); cityRepository.save(berlin); cityRepository.save(duesseldorf); } }
实体类City.java
package com.d043114.minimalJPA; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name = "cities") public class City { @Id @GeneratedValue(strategy = GenerationType.AUTO ) private long ID; private String name; private boolean isCapital; public long getID() { return ID; } public void setID(long iD) { ID = iD; } public String getName() { return name; } public void setName(String name) { this.name = name; } public boolean isCapital() { return isCapital; } public void setCapital(boolean capital) { isCapital = capital; } }
内容的提问来源于stack exchange,提问作者Habi
相关产品推荐
相关产品推荐

