【问题标题】:SpringBoot library project does not see main app propertiesSpring Boot 库项目看不到主要应用程序属性
【发布时间】:2020-11-07 06:11:32
【问题描述】:

我有这样的设置:

  1. 具有 application-default.properties 的主 SpringBoot 项目在我们的部署服务器上被部署特定属性部分覆盖。
  2. 共享 SpringBoot 库项目,拥有自己的属性。

当我运行带有库项目的主项目时(通过 gradle sourceControl gitRepository),我可以看到库项目中的属性是空的。

如何使库项目使用从主应用程序传下来的属性?

【问题讨论】:

    标签: java spring-boot kotlin properties-file


    【解决方案1】:

    如果你想合并属性,请考虑这个official page

    选项 1 - 库中的默认属性

    正如我之前发现的(可能已修复),如果您有 jar1 和 jar2(按字母顺序排序)并且它们都有 application.properties 文件,则只会使用第一个。它们没有合并。所以请小心。

    但是,您可以在库中使用 @PropertySource,例如将默认属性放入自定义文件名中(例如 - defaults-for-jar2.properties 或类似的东西,以避免 Spring 自动加载)。

    在这种情况下:

    1. 库外的属性加载逻辑将与当前相同。
    2. 您的库将从@PropertySource 加载文件,然后它们将被您的应用程序覆盖(如果有的话)。

    选项 2 - 配置属性

    如果你使用 Kotlin 和 Spring,你可以使用ConfigurationProperties。您可以在那里定义默认值。此外,IntelliJ Idea 会突出显示默认值和可能值(根据类型,因为您不仅可以使用 String,还可以使用任何自定义的enum classDuration 类等)。

    仅来自该链接:

    @ConstructorBinding
    @ConfigurationProperties("blog")
    data class BlogProperties(var title: String, val banner: Banner) {
      data class Banner(val title: String? = null, val content: String)
    }
    
    @SpringBootApplication
    @EnableConfigurationProperties(BlogProperties::class)
    class BlogApplication {
      // ...
    }
    

    请注意:

    1. 您应该在库配置中提及您的设置数据类。
    2. 您应该正确配置 kapt 以在 IDE 中使用 Intelli Sence。

    【讨论】:

    • 我尝试了第一个解决方案,并将属性文件重命名为“common.properties”,并将主类注释为“@PropertySource”。但是我仍然从主应用程序运行代码,我可以看到库中的 bean 没有初始化(我假设 @Value 没有被正确发现和自动装配)
    • @darkhie,你可以试试@PropertySource("classpath:config.properties") 之类的mkyong.com/spring/spring-propertysources-example 吗?我忘记了正确的符号,但是如果您想查看罐子,您必须添加 classpath 前缀。
    猜你喜欢
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    • 2019-05-06
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多