开发者社区 问答 正文

java 如何通过Spring Boot多个模块继承application.properties?

我使用spring boot多个模块,我想从parent继承application.properties。我有父模块:spring-ecommere-demo和子模块:model,core和security。在父模块中,我将一些配置jdbc看起来像:

application.properties(父模块)

spring.datasource.url=jdbc:mysql://localhost:3306/BaoTrung spring.datasource.username=root spring.datasource.password=123456 spring.jpa.show-sql=true 在子模块安全性中,我的特定配置如下所示:

application-security.properties(安全模块)

app.jwtSecret= JWTSuperSecretKey app.jwtExpirationInMs = 604800000 在安全模块的Spring Boot应用程序中的配置如下所示:

@SpringBootApplication(scanBasePackages = "springecommeredemo") @PropertySources({ @PropertySource("application-security.properties") }) 但是当我运行它时,它会抛出异常

描述:

无法配置数据源:未指定'url'属性,并且无法配置任何嵌入式数据源。

原因:无法确定合适的驱动程序类别

行动:

请考虑以下因素:如果您想要嵌入式数据库(H2,HSQL或Derby),请将其放在类路径中。如果您要从特定概要文件中加载数据库设置,则可能需要激活它(概要文件开发当前处于活动状态)。

这意味着子模块安全性不能从父项目继承属性。如何从父模块继承所有属性。因为我使用相同的数据库,所以我不想在项目中配置重复的jdbc。我要继承通用属性。

展开
收起
被纵养的懒猫 2019-09-25 13:59:31 1235 分享 版权
阿里云 AI 助理回答

在Spring Boot中,为了使子模块能够继承父模块的application.properties配置,你需要确保你的项目结构和配置正确地集成在一起。以下是一些步骤和建议来解决你遇到的问题:

  1. 确保父子模块关系:首先确认你的Maven或Gradle构建文件(pom.xmlbuild.gradle)正确设置了父子模块关系。父模块应包含所有通用依赖、插件配置以及属性定义。

  2. 使用spring-boot-starter-parent:如果你的父模块不是直接继承自spring-boot-starter-parent,考虑这样做,因为它提供了许多默认配置,包括配置文件处理。

  3. 配置文件位置:Spring Boot默认从以下位置加载application.propertiesapplication.yml

    • 项目类路径根目录
    • src/main/resources/config/目录
    • 当前活动的Spring Profile对应的目录下

    确保你的父模块中的application.properties位于这些标准位置之一。

  4. Profile特定配置:如果你有特定于环境的配置,可以使用Spring Profiles。但在这个场景中,你希望所有模块共享相同的数据库配置,所以不需要为每个模块单独设置profile,除非安全模块需要覆盖某些特定配置。

  5. 避免显式指定@PropertySource:在你的安全模块中,你通过@PropertySource("application-security.properties")显式指定了一个额外的属性文件。这实际上告诉Spring去查找这个特定的文件,而不是默认的application.properties。如果想要继承父模块的配置,通常不需要这样做,除非你想明确地添加或覆盖某些属性。

  6. 使用YAML配置(可选):虽然不是必须的,但使用application.yml而非application.properties有时能提供更清晰的层次化配置结构,特别是当你需要合并多个配置源时。

  7. 模块间配置共享:对于跨模块共享的配置,最佳实践是将它们放在父模块的application.properties中,并确保所有子模块都能访问到它。子模块如果有额外的配置需求,可以在自己的application.properties中添加,而无需显式引用父模块的配置文件。

  8. 检查模块依赖:确保子模块的构建配置中正确包含了对父模块的依赖,这样配置文件才能被正确读取。

综上所述,移除安全模块中@PropertySources的显式声明可能是解决问题的关键,因为这允许Spring Boot自动发现并加载所有相关的配置文件,包括父模块中的application.properties。如果确实需要在安全模块中添加额外的配置而不覆盖父级配置,可以考虑将这些配置也放入父模块的配置文件中,或者利用Spring的配置文件继承机制(例如,使用spring.config.import特性导入其他配置文件)。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答