【问题标题】:Spring Properties Defined in File not Resolved文件中定义的 Spring 属性未解析
【发布时间】:2020-01-29 19:15:02
【问题描述】:

application.properties中定义属性时如

deployment=dev
spring.profiles.active=${deployment}

Spring 无法正确解析 deployment 属性。

Main : The following profiles are active: ${deployment}

相反,我必须在变量的每个实例中指定一个默认值,例如

deployment=dev
spring.profiles.active=${deployment:dev}

但是,当我通过各种方式之一(环境变量、系统属性等)覆盖属性时,设置值在任何地方都被正确解析。有没有办法在application.properties 文件中定义默认值?

【问题讨论】:

    标签: java spring spring-boot spring-profiles spring-properties


    【解决方案1】:

    你可以这样做:

    创建一个包含默认设置的 application.properties 文件。

    然后创建一个 applicaiton-ENV.properties 文件,其中包含 ENV 的任何附加值或重载值(在您的示例中,ENV 将是 dev)

    然后在运行时设置环境变量spring.profiles.active=dev

    java .... -Dspring.profiles.active=dev  YourSpring.jar
    

    这将导致 spring boot 以您想要的配置文件运行,并将读取默认值和附加的 -dev 文件。

    这允许您为无限数量的环境设置多个不同的应用程序属性。如果你没有设置 spring.profiles.active 环境变量,它只会加载默认的 application.properties 文件来运行。

    【讨论】:

    • 我知道这可以做到,但我希望在主 application.properties 文件中定义的属性是可解析的。例如,我有db.name=app_${deployment}。我基本上想要设置默认值,这样我就不需要设置环境变量来运行项目,除非我需要覆盖。
    • 虽然您当然可以执行 db.name=app_${deployment} 并工作,但我认为您不能将参考模型与 spring.profiles.active 值一起使用。我不相信会正确评估您的内部参考。毕竟要让 SpringBoot 运行,您需要知道您正在运行的环境,所以我怀疑它不会像在启动序列中进一步评估的其他值那样完全评估 application.properties 文件中的该行我打赌。
    • 你当然可以做 somevar=somevalue db.name=${somevar} 但为了让 SpringBoot 启动它需要知道它的配置文件,所以我敢打赌,该行将按原样评估并传递给该值,没有 app.prop 文件的所有后续处理,因为它在启动序列的后面出现..>>我可能是错的,但这是我的假设。毕竟,如果您的个人资料是 STG,它怎么能确保它应该使用的每个值?它不会从默认文件中读取 -stg 文件。它必须设置该值才能继续运行...
    • 想象一下:application.properties 文件有“deployment=stg”,然后 application-stg.properties 有“deployment=tst”如果你被允许你怎么能得到活动配置文件的值做你想做的事?并且有 "spring.profiles.active=${deployment}" 你不能...
    【解决方案2】:
    ${GROUP_ID:123456}
    

    您可以通过上述方式指定作为属性一部分的默认值:

    【讨论】:

    • 正如我在问题中提到的,我已经在这样做了。我只是不想在该属性存在的任何地方重复它
    • 我明白了,一旦我一直想要实现类似的东西,所以我创建了 application-local.properties 并将我的运行时配置为使用我的 application-local.properties。也许有一种方法可以像您一样将 environment 定义为“dev”,如果它是 dev ,您可以尝试让 springboot 默认从 application-local.properties 中提取所有变量。我正在尝试启动这样的工作,如果您还没有找到更好的解决方案,希望这个建议会有所帮助。
    猜你喜欢
    • 2013-09-26
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多