【问题标题】:Springboot linking Environment values from Properties files but not from YAML filesSpringboot 链接来自属性文件而不是来自 YAML 文件的环境值
【发布时间】:2022-01-14 17:45:44
【问题描述】:

这很奇怪,现在我有点困惑我的方法出了什么问题。

我正在使用 2 个 Spring-Boot 框架并编写简单的微服务应用程序。

项目 1

常量.java

public static final String TEST_HOST                           = "${test1.host}"

application.properties

test1.host=https://somewhere.com

我可以毫无问题地读取此值,即https://somewhere.com

项目 2

常量.java

public static final String TEST_HOST                           = "${test1.host}"

应用程序.yaml

test1:
  host: https://somewhere.com

在上述情况下,它给了我${test1.host} 的值,我期望表达式应该被执行,但它被视为具有字符串值而不是环境值的常量。

【问题讨论】:

    标签: spring-boot yaml


    【解决方案1】:

    不要这样做:

    public static final String TEST_HOST = "${test1.host}"
    

    添加注解@Value,以便您可以从配置文件中注入属性,如下面的sn-p:

    @Value("${test1.host}")
    public String host;
    

    第二个项目也是如此。

    别忘了用这个注解@Configuration来装饰保存配置值的类。

    【讨论】:

    • 我不能在没有初始化的情况下保留变量,它不允许这样做,强制我需要设置为null 值,最终它在 IoC 启动时给我 NULL
    • 只是为了澄清一下,您将配置值用作静态和最终值,我仍然想知道为什么您会使用然后从配置文件中注入的属性。因此,您可以通过以下方式进行处理: 1. 使用符号Constants::TEST_HOST 调用这些属性 2. 或者通过使用上面的(@Value),如果您想调用控制器或服务层上的任何参数并且您通常这样做,首先声明一个像 @Autowired private Constants constants 这样的类变量,您可以通过它们的 getter 调用任何所需的属性,因为它们通常被声明为私有的。我希望你明白这一点。
    • 所以,我的意图是将其保留为静态常量,并且我可以在整个应用程序中重用这些变量,我只想在 spring-boot IoC 启动时创建这些常量。我能够解决的是直接使用 '${test1.host}' 例如我正在使用FeignClient,但我真的不喜欢在那里使用属性名称,以防万一我想更改键名,即test1.host,更新可能会很复杂。
    • 不幸的是,您无法通过使用 static 属性来实现您的目标,因为保存配置值的类是由 spring bean 容器实例化的。所以我强烈建议考虑提出的解决方案。帖子中提供了重要的演示图片,它可以正常工作。
    • 感谢@Ali Arabat,我认为这种方法可以帮助我解决我想要解决的问题。
    猜你喜欢
    • 1970-01-01
    • 2015-05-17
    • 1970-01-01
    • 2014-07-16
    • 1970-01-01
    • 2018-04-22
    • 1970-01-01
    • 1970-01-01
    • 2017-09-09
    相关资源
    最近更新 更多