【问题标题】:@Value from application.yml returns wrong valueapplication.yml 中的 @Value 返回错误值
【发布时间】:2017-03-16 07:59:53
【问题描述】:

在我的application.yml 文件中声明:

service:
  a: 
    b: 011600
    c: 011200

通过@Value注解从.yml中选择值:

@Value("${service.a.c}")
private String VALUE;

我得到的是 '4992',而不是预期的 '011200',这在 .yml 中没有提及。

【问题讨论】:

  • 您是否尝试引用这些数字?从 0 开始就像它会被解释为八进制或十六进制数字......只是猜测
  • @alphamikevictor,是的,真的,报价有效。谢谢你的评论,看来这是正确的答案
  • 但是 4992 不是十六进制/八进制表示
  • 我知道,我正在尝试转换,但没有找到执行哪种转换;但你会明白,如果没有引用,就完成了一些转换。

标签: java spring-boot yaml


【解决方案1】:

您没有指定文档的 YAML 版本,看起来您的解析器默认为 1.1 版(或 1.1 版兼容性)。这会导致以 0 开头后跟数字的值被解释为八进制,011200(八进制)的值是 4736(十进制),011600(八进制)的值是 4992

在 YAML 1.2 中,八进制整数值应以 Oo 开头,因此 011200 将是整数 11200

尝试使用:

%YAML 1.2
---
service:
  a:
    b: 011600
    c: 011200

如果这不能让您获得想要的价值,您应该考虑使用兼容的 YAML 解析器(YAML 1.2 规范是从 2009 年开始的,因此有足够的时间来解决问题)。

你当然可以引用你的整数标量,但是它们会被加载为字符串,而不是整数。在这种情况下,您不需要指定版本标记,版本 1.2 和 1.1 的解释方式相同:

service:
  a:
    b: '011600'
    c: '011200'

如果在获取您在文件中指定的十进制值后,您仍然得到错误的 @Value("${service.a.c}") 值,那么您应该考虑使用不同的访问方法(如果键中有一个点(例如 @ 987654332@) 或另一个解析器。

【讨论】:

【解决方案2】:

试着引用你的值,所以它们是字符串。

【讨论】:

    猜你喜欢
    • 2020-04-15
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    • 2019-11-24
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多