当前位置: 首页 > news >正文

Spring Boot YML配置值“011“在代码中变为9的问题解析

Spring Boot YML配置值"011"在代码中变为9的问题解析

问题原因

当您在YML配置文件中设置011这样的值时,Spring Boot会将其解析为八进制数字,导致最终获取的值为十进制的9。这是因为:

  1. YAML规范中,以0开头的数字字面量会被解析为八进制数
  2. 八进制的011等于十进制的9(0×8² + 1×8¹ + 1×8⁰ = 9)
  3. Spring Boot在绑定属性时会自动进行这种数值转换

解决方案

方案1:使用引号强制作为字符串处理(推荐)

your-property: "011"  # 加双引号

方案2:使用单引号包裹

your-property: '011'  # 单引号也可以

方案3:在Java代码中指定类型

@Value("#{'${your-property}'}")  // 使用SpEL确保字符串类型
private String yourProperty;

方案4:使用配置类绑定

@ConfigurationProperties(prefix = "your")
public class YourConfig {private String property; // 会保持原始字符串值// getter/setter
}

方案5:避免前导零(如果业务允许)

your-property: 11  # 去掉前导零

为什么这些方案有效

  1. 引号方案:YAML将加引号的内容识别为字符串而非数字
  2. SpEL方案#{}表达式会阻止自动类型转换
  3. 配置类方案@ConfigurationProperties对类型转换更宽松
  4. 去掉前导零:避免被识别为八进制数

完整示例

application.yml:

demo:code: "011"  # 使用引号

Java代码:

@Value("${demo.code}")
private String code; // 现在会得到"011"而不是9

补充说明

  1. 这个问题只影响数字形式的值,字母数字混合的值(如cert-id)不受影响
  2. 该行为是YAML 1.1规范定义的,现代YAML 1.2已修改此行为,但Spring Boot仍保持向后兼容
  3. 在Spring Boot 2.4+版本中,这种行为仍然存在

建议采用加引号的方案,这是最清晰且符合YAML最佳实践的做法。

相关文章:

  • leetcode 2799. 统计完全子数组的数目 中等
  • 玩转Docker | Docker部署LMS轻量级音乐工具
  • 加深对vector理解OJ题
  • MQTT 之 EMQX
  • pnpm install报错:此系统上禁止运行脚本
  • 电竞俱乐部护航点单小程序,和平地铁俱乐部点单系统,三角洲护航小程序,暗区突围俱乐部小程序
  • 1.7软考系统架构设计师:系统架构设计师概述 - 超简记忆要点、知识体系全解、考点深度解析、真题训练附答案及解析
  • 【LLM+Code】Github Copilot Agent/VsCode Agent 模式PromptTools详细解读
  • windows系统自定义powshell批处理脚本
  • AOSP CachedAppOptimizer 冻结方案
  • 哑光蓝色调风光人像Lr调色教程,手机滤镜PS+Lightroom预设下载!
  • 部署本地知识库,怎么选择 vllm 和 langchain_ollama
  • MATLAB 中的图形绘制
  • Cadence 建立复合原理图封装时怎么切换页面
  • Django创建的应用目录详细解释以及如何操作数据库自动创建表
  • JavaScript 中的尾递归:优点与应用场景
  • Trae+DeepSeek学习Python开发MVC框架程序笔记(四):使用sqlite验收用户名和密码
  • VIC-3D非接触全场应变测量系统用于小尺寸测量之电子元器件篇—研索仪器DIC数字图像相关技术
  • containerd 配置代理
  • 如何在 Dialog 中安全初始化 ECharts 并自动监听容器大小变化
  • 瑞士外长答澎湃:瑞中都愿升级自贸协定,关税战没有任何好处
  • 我国首次发布铁线礁、牛轭礁珊瑚礁“体检”报告,菲炮制言论毫无科学和事实依据
  • 神舟二十号载人飞船与空间站组合体完成自主快速交会对接
  • 限制再放宽!新版市场准入负面清单缩减到106项
  • 2025年超长期特别国债24日首次发行
  • 新任乒协副主席马龙:感谢刘国梁,愿把经验传给年轻运动员