Spring Boot多模块项目配置异常:数据源、包扫描、Swagger相关问题求助
问题根因
- 你在公共模块
rabbit-mq-AOP的配置类上错误使用了@EnableAutoConfiguration注解:该注解是Spring Boot启动类专用的全局注解,添加到普通配置类后,注解中配置的DataSourceAutoConfiguration排除规则会全局生效,导致依赖DataSource的main-module无法正常初始化连接池,报错ExistingValue must be an instance of com.zaxxer.hikari.HikariDataSource - 公共模块配置类被启动类包扫描加载时,规则冲突导致业务模块的Bean扫描异常:缩小包扫描范围到
com.a.producer时无法加载main-module自身的Controller、Repository等Bean,所以接口无法访问、Swagger无内容。
可行解决方案
步骤1:修改公共模块rabbit-mq-AOP的配置类
直接删除@EnableAutoConfiguration注解,仅保留基础配置注解即可:
@Configuration @Order(value = Ordered.LOWEST_PRECEDENCE) public class RabbitMQConfig { .... }
注:如果公共模块本身不需要依赖JDBC/DataSource相关能力,直接在pom中移除
spring-boot-starter-jdbc、mybatis-spring-boot-starter等触发DataSource自动配置的依赖,从根源避免DataSource自动配置触发。
步骤2:优化公共模块为可复用自动配置(推荐)
要让rabbit-mq-AOP可在多个项目中复用,无需业务项目手动配置包扫描,按Spring Boot自动配置规范改造即可:
- 给RabbitMQConfig类添加
@AutoConfiguration注解替换原来的@Configuration - 在模块的
resources/META-INF/spring目录下新建文件org.springframework.boot.autoconfigure.AutoConfiguration.imports,文件内容填写RabbitMQConfig的全限定类名,示例:
com.a.producer.RabbitMQConfig
步骤3:恢复main-module启动类配置
启动类的包扫描恢复为扫描自身业务根包即可,无需额外添加单独的Repository、Entity扫描注解:
@EnableSwagger2 @SpringBootApplication(scanBasePackages = "com.a.ds") public class MainApplication extends SpringBootServletInitializer { .... }
注:因为公共模块的配置已经通过自动配置机制加载,不需要把公共模块的包加入扫描范围,完全避免包扫描冲突。
异常场景兼容
如果你的公共模块需要兼容部分没有DataSource的项目,不要在配置类加全局排除,而是在自动配置类上添加条件注解:
@AutoConfiguration @ConditionalOnClass(RabbitTemplate.class) @ConditionalOnProperty(prefix = "rabbitmq.aop", name = "enabled", havingValue = "true", matchIfMissing = true) public class RabbitMQConfig { .... }
如果某个集成的项目不需要DataSource,在项目自身的配置文件中添加排除规则即可,不要在公共模块加全局排除:
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
内容的提问来源于stack exchange,提问作者Learning Developer
相关产品推荐
相关产品推荐

