Spring多模块项目:前端端口可访问后端API问题排查与解决
问题排查与解决方案
核心原因
你给frontend-module添加了backend-module的依赖,Spring Boot启动时会自动将后端模块中的@RestController、@Controller等Bean加载到前端模块的Spring容器中,相当于前端模块启动时也注册了后端的API接口,所以通过3008端口能访问到原本属于8008端口的接口。
排查步骤
- 检查frontend-module的
pom.xml(Maven)或build.gradle(Gradle),确认是否直接/间接引入了backend-module的依赖 - 启动前端模块后,查看控制台日志,是否存在类似
Mapping GET "/api/get"的接口注册日志,若有则说明后端Controller被加载到了前端容器中 - 可调试前端模块的Spring上下文,验证其中是否包含后端Controller的实例
解决办法
1. 移除不必要的模块依赖
如果前端仅需通过HTTP请求调用后端API,无需模块级的依赖,直接删除pom/gradle文件中对backend-module的依赖即可。前端与后端完全通过HTTP交互,不需要模块耦合。
2. 用Spring Profiles隔离Bean加载
若必须保留依赖(比如共享DTO类),可通过Profiles控制后端Controller的加载:
- 给backend-module中所有Controller类添加
@Profile("backend")注解 - 在后端模块的配置文件(application.yml/application.properties)中添加
spring.profiles.active=backend,激活该Profile - 前端模块的配置文件不激活
backendProfile,这样前端启动时就不会加载后端的Controller Bean
3. 拆分后端模块(规范方案)
将backend-module拆分为两个子模块:
backend-api:仅存放公共DTO、接口定义等无执行逻辑的代码backend-core:存放Controller、业务逻辑等实际处理请求的代码
让frontend-module仅依赖backend-api,不依赖backend-core,避免后端Controller被加载到前端容器中
验证方法
修改后单独启动frontend-module,访问localhost:3008/api/get应返回404状态码;启动backend-module后,访问localhost:8008/api/get能正常返回结果,即说明隔离成功。
内容的提问来源于stack exchange,提问作者AleXeNoN
相关产品推荐
相关产品推荐

