配置 Spring Boot 多模块项目的问题
Posted
技术标签:
【中文标题】配置 Spring Boot 多模块项目的问题【英文标题】:Problems Configuring Spring boot multi-module Project 【发布时间】:2021-11-23 00:10:00 【问题描述】:我在配置 Spring Boot 多模块项目时遇到问题!
这是我的父母 pom
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.2</version>
<relativePath/>
</parent>
<modules>
<module>main-module</module>
<module>rabbit-mq-AOP</module>
</modules>
<dependencies>
common dependencies..
</dependencies>
在rabbit-mq-AOP
模块中,我只有一个配置类用于配置rabbit MQ 从属性文件中读取值,并且我添加了用于捕获APIS 请求/响应的AOP。
它没有存储库或实体类或控制器。
配置类如下:
@EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class )
@Configuration
@Order(value = Ordered.LOWEST_PRECEDENCE)
public class RabbitMQConfig ....
注意我添加了排除DataSourceAutoConfiguration
,因为如果我不在rabbit-mq-AOP
中使用这个模块,它会在启动main-module
时给我错误
Caused by: java.lang.IllegalArgumentException: ExistingValue must be an instance of com.zaxxer.hikari.HikariDataSource
rabbit-mq-AOP
中的基本包是com.a.producer
。
main-module
中的基本包是com.a.ds
。
这是我试图从中运行的模块 main-module
的主类
@EnableSwagger2
@SpringBootApplication(scanBasePackages = "com.a")
public class MainApplication extends SpringBootServletInitializer ....
使用上述配置,应用程序无法启动并开始在此模块的存储库类上给出No qualifying bean of type
错误。
如果我将上面的主类更改为@SpringBootApplication(scanBasePackages = "com.a.producer")
应用程序将启动,但不会在main-module
的招摇中列出任何控制器,实际上 API 也无法工作其余控制器无法识别。 swagger-ui 正在检测应按照属性文件中的配置隐藏的执行器 api
SWAGGER - UI
注意:使用 Spring 日志作为 DEBUG 请注意这一特定行。
Exclusions:
-----------
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
我依赖于 Spring 的 DataSource Auto 配置,只需在属性文件中添加 Jpa 属性而不是自定义配置类。
引导解决这个问题,因为我必须在多个项目中使用模块 rabbit-mq-AOP
,它会从集成它的位置读取属性,即在这种情况下从 main-module
更新:
如果我在主类上添加这些注释。
@EnableJpaRepositories("com.a.ds.repository")
@EntityScan("com.a.ds.dto.entity")
@ComponentScan("com.a.ds.config")
我又得到了这个现在不应该出现的错误。
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]: Unsatisfied dependency expressed through method 'dataSourceScriptDatabaseInitializer' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: ExistingValue must be an instance of com.zaxxer.hikari.HikariDataSource
【问题讨论】:
【参考方案1】:分两步解决问题
添加了这些注释
@EnableAutoConfiguration @ComponentScans( @ComponentScan(basePackages = "com.a.ds.*")) @Order(value = Ordered.HIGHEST_PRECEDENCE)
关于主模块中的配置类
-
使用两个 bean
dataSource
和 entityManagerFactory
创建了数据库配置类
【讨论】:
以上是关于配置 Spring Boot 多模块项目的问题的主要内容,如果未能解决你的问题,请参考以下文章
是否可以从 Maven 多模块项目的父模块中的配置文件夹加载 Spring-Boot 属性?
Spring boot application.properties maven 多模块项目
多模块 Spring Boot 项目中的 Gradle 依赖插件