配置 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 dataSourceentityManagerFactory 创建了数据库配置类

【讨论】:

以上是关于配置 Spring Boot 多模块项目的问题的主要内容,如果未能解决你的问题,请参考以下文章

是否可以从 Maven 多模块项目的父模块中的配置文件夹加载 Spring-Boot 属性?

Spring boot application.properties maven 多模块项目

多模块 Spring Boot 项目中的 Gradle 依赖插件

Spring Boot 多模块项目创建与配置[转]

Spring Boot maven 多模块项目——单元测试(应用上下文)

spring boot关于多个模块(module)的配置问题