Spring Data REST(STS)分包后实体链接不显示问题求助
看起来你的问题核心是Spring Boot的组件扫描范围没有覆盖到Repository和实体类所在的包,导致Spring Data REST无法识别你的EmployRepository,自然不会在根路径生成employees的链接。
问题根源
Spring Boot默认会从启动类(这里是EmployeeApi)所在的包及其子包进行组件扫描。你的启动类在com.employee包,而EmployRepository在com.repository、Employee实体在com.entities——这两个包和com.employee是同级包,不在默认扫描范围内,所以Spring无法发现这些组件,也就不会自动生成对应的REST端点。而当你把所有类放在同一包下时,默认扫描能覆盖到,所以一切正常。
解决方案
这里有几种可行的解决方法,你可以根据自己的偏好选择:
方法1:调整包结构(推荐)
把Repository和实体类的包改成启动类包的子包,这样无需额外配置就能被默认扫描到:
- 实体类包改为
com.employee.entities - Repository包改为
com.employee.repository - 启动类保持在
com.employee
这种方式符合Spring Boot的约定优于配置原则,结构更清晰。
方法2:在启动类上显式指定扫描范围
如果不想调整包结构,可以在EmployeeApi类上添加注解,手动指定要扫描的包:
package com.employee; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.boot.autoconfigure.domain.EntityScan; @SpringBootApplication // 指定Repository所在的包 @EnableJpaRepositories(basePackages = "com.repository") // 指定实体类所在的包 @EntityScan(basePackages = "com.entities") public class EmployeeApi { public static void main(String[] args) { SpringApplication.run(EmployeeApi.class, args); } }
方法3:通过@SpringBootApplication统一指定扫描包
@SpringBootApplication注解本身支持通过scanBasePackages参数指定扫描范围,同时结合@EnableJpaRepositories和@EntityScan确保Repository和实体类被正确识别:
package com.employee; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.boot.autoconfigure.domain.EntityScan; @SpringBootApplication(scanBasePackages = {"com.employee", "com.repository", "com.entities"}) @EnableJpaRepositories(basePackages = "com.repository") @EntityScan(basePackages = "com.entities") public class EmployeeApi { public static void main(String[] args) { SpringApplication.run(EmployeeApi.class, args); } }
验证修改
完成上述任意一种修改后,重启应用,再次访问localhost:8080,你应该就能看到预期的包含employees链接的响应了:
{ "_links" : { "employees" : { "href" : "http://localhost:8080/employees" }, "profile" : { "href" : "http://localhost:8080/profile" } } }
内容的提问来源于stack exchange,提问作者Momo Shaheen

