SpringBoot引入Maven公共模块的REST Controller访问报404如何解决?
这种将公共Controller、通用配置封装到独立Maven模块的需求是完全可实现的,也是企业级开发中非常常见的公共组件封装实践,不存在不推荐的问题。404问题的本质是公共模块的Controller没有被Spring扫描注册到应用上下文中。
核心原因
Spring Boot 默认只会扫描启动类所在包及其子包下的Bean(包括Controller、Service等),你的common-crud模块的包路径和app-client启动类的包路径不匹配,因此公共模块里的Controller没有被注入到Spring容器中,自然无法响应请求。
解决方案
可根据使用场景二选一:
方案1:手动指定扫描路径(适合单项目快速适配)
在app-client的启动类上,补充@ComponentScan注解,同时指定业务项目和公共模块的包路径:
@SpringBootApplication // 替换为你实际的业务包、公共模块根包路径 @ComponentScan(basePackages = {"com.mainapp", "com.common.crud"}) public class AppClientApplication extends SpringBootServletInitializer { // 启动类原有逻辑 }
如果你还在公共模块中封装了JPA Repository、实体类、SpringSecurity配置等,还需要同步补充对应注解的扫描路径:
- JPA Repository:追加
@EnableJpaRepositories(basePackages = {"com.mainapp.repository", "com.common.crud.repository"}) - 实体类:追加
@EntityScan(basePackages = {"com.mainapp.entity", "com.common.crud.entity"})
方案2:自动装配(适合公共组件给多项目复用,无侵入)
这种方案不需要业务项目修改任何配置,引入依赖即可自动生效,更符合Spring Boot的设计理念:
- 在common-crud模块的
src/main/resources下新建META-INF目录,创建spring.factories文件,写入以下内容:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.common.crud.config.CommonCrudAutoConfig
- 在common-crud模块中创建自动配置类
CommonCrudAutoConfig.java:
package com.common.crud.config; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration // 替换为公共模块的根包路径 @ComponentScan(basePackages = "com.common.crud") public class CommonCrudAutoConfig { // 如果有SpringSecurity等其他公共配置,也可以在这个类里声明或者导入 }
完成后重新打包common-crud模块,app-client无需修改任何代码,重新打包部署即可访问公共模块的接口。
SpringSecurity适配场景补充建议
多类型认证能力的封装完全可以基于上述自动装配方案实现:
不同认证方式的配置类分别封装,通过@ConditionalOnProperty注解实现开关控制,示例如下:
@Configuration @ConditionalOnProperty(name = "security.auth.type", havingValue = "saml") public class SamlSecurityConfig { // SAML认证配置逻辑 } @Configuration @ConditionalOnProperty(name = "security.auth.type", havingValue = "jwt") public class JwtSecurityConfig { // JWT认证配置逻辑 }
业务项目只需要在配置文件中指定security.auth.type=saml即可自动加载对应认证配置,不需要修改代码。
额外注意事项
- 公共模块的Controller需要确保加了
@RestController/@Controller注解,避免漏注无法被扫描。 - 建议公共模块的接口统一加前缀(比如
/common/),避免和业务项目的接口路径冲突。 - 若Tomcat配置的上下文根为mainapp,实际访问路径应为
http://localhost:8080/mainapp/sayHelloFromModule,注意不要写错上下文根。
内容的提问来源于stack exchange,提问作者CoderJammer
相关产品推荐
相关产品推荐

