springboot配置文件中的巨坑!!

news2024/11/24 18:52:27

问题

application.yml

test:
  password1: 030030
  password2: '030030'

使用此配置的bean

@Component
public class Test {
    
    @Value("${test.password1}")
    private String password1;
    
    @Value("${test.password2}")
    private String password2;
    
    @PostConstruct
    public void postConstruct() {
        System.out.println("password1 : " + password1);
        System.out.println("password2 : " + password2);
    }
}

结果

password1 : 12312
password2 : 030030

why?,为啥030030的int类型会被读取成12312 ??,而字符类型就正常呢?

思路

关键在org.yaml.snakeyaml.constructor.SafeConstructor.ConstructYamlInt类中,此类是springboot读取Int类型配置的处理类。当然还有其他类型
在这里插入图片描述
从结构和类的命令中可以看到是在读取yml文件中对各种数据类型都有相应的处理类。下面我们来直接分析Int类型的处理类ConstructYamlInt

ConstructYamlInt

public class ConstructYamlInt extends AbstractConstruct {
    @Override
    public Object construct(Node node) {
        //获取到配置的值030030
        String value = constructScalar((ScalarNode) node).toString().replaceAll("_", "");
        int sign = +1;
        //firtst为'0'
        char first = value.charAt(0);
        if (first == '-') {
            sign = -1;
            value = value.substring(1);
        } else if (first == '+') {
            value = value.substring(1);
        }
        int base = 10;
        if ("0".equals(value)) {
            return Integer.valueOf(0);
          //如果value以0b开头,则认为value是2进制  
        } else if (value.startsWith("0b")) {
            value = value.substring(2);
            base = 2;
          //如果value以0x开头,则认为value是16进制  
        } else if (value.startsWith("0x")) {
            value = value.substring(2);
            base = 16;
          //如果value以0开头,则认为value是8进制
          //030030就会进入此if条件
        } else if (value.startsWith("0")) {
            //最前面的0被截取掉变成了30030
            value = value.substring(1);
            base = 8;
        } else if (value.indexOf(':') != -1) {
            String[] digits = value.split(":");
            int bes = 1;
            int val = 0;
            for (int i = 0, j = digits.length; i < j; i++) {
                val += Long.parseLong(digits[j - i - 1]) * bes;
                bes *= 60;
            }
            return createNumber(sign, String.valueOf(val), 10);
        } else {
            return createNumber(sign, value, 10);
        }
        //最后会执行到这里
        //sign = 1
        //value = 30030
        //base = 8
        return createNumber(sign, value, base);
    }
}

createNumber(sign, value, base)

private Number createNumber(int sign, String number, int radix) {
	//得到number的长度,30030也就是长度为5
    final int len = number != null ? number.length() : 0;
    if (sign < 0) {
        number = "-" + number;
    }
    //这里得到的maxArr = [11,21]
    final int[] maxArr = radix < RADIX_MAX.length ?  RADIX_MAX[radix] : null;
    if (maxArr != null) {
        final boolean gtInt = len >maxArr[0];
        if (gtInt) {
            if(len > maxArr[1]) {
                return new BigInteger(number, radix);
            }
            return createLongOrBigInteger(number, radix);
        }
    }
    Number result;
    try {
    	//这里将30030当做八进制来转化为十进制后返回也就是12312
        result = Integer.valueOf(number, radix);
    } catch (NumberFormatException e) {
        result = createLongOrBigInteger(number, radix);
    }
    return result;
}

所以就解释了为啥030030在被读取后会变成12312

总结

本质原因就是配置值以0开头的,所以被yml解析时认为value是8进制的,帮我们转换成了10进制,所以导致读取后的值和开始配置的值对不上。

解决起来很简单,就是在yml中配置数字时,避免0、0b、0x开头。如果无法避免,则使用字符类型,因为字符类型不会做处理。

ConstructYamlStr

public class ConstructYamlStr extends AbstractConstruct {
    @Override
    public Object construct(Node node) {
        return constructScalar((ScalarNode) node);
    }
}

详细的springboot配置解析,可参考此文章详解SpringBoot解析yml全流程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/639060.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业微信建设代开发应用的基本流程及实现

一、企业微信代开发应用的基本流程 企业微信中除了系统提供的应用以及上架应用商店的第三方应用外&#xff0c;也可以使用自己开发的应用&#xff0c;不过多数企业都不具备开发能力&#xff0c;只能采用代开发的形式进行定制。就给大家分享一下企业微信代开发应用的基本流程&a…

java八股面试文(带答案,万字总结,精心打磨,建议收藏)堪称2023最强

前言 2023秋招即将来临&#xff0c;很多同学会问Java面试八股文有必要背吗&#xff1f; 我的回答是&#xff1a;很有必要。你可以讨厌这种模式&#xff0c;但你一定要去背&#xff0c;因为不背你就进不了大厂。 国内的互联网面试&#xff0c;恐怕是现存的、最接近科举考试的…

【Java项目】不使用ES实现关键词搜索问题

文章目录 需求解决思路基本设计查询流程插入流程修改流程删除流程 优化思路总结 需求 ok&#xff0c;这个需求是我提的&#xff0c;然后我问了我的一位杭州的朋友&#xff0c;然后我们最后一起敲定这个方法。 我的项目有一个根据关键字进行商品名称的搜索功能&#xff0c;用户…

安卓期末考试知识总结

文章目录 第一章&#xff1a;Android基础入门习题总结重点知识 第二章&#xff1a;Android常见桌面布局&第三章&#xff1a;Android常见界面控件知识总结习题总结 第一章&#xff1a;Android基础入门 习题总结 Android系统采用分层架构&#xff0c;由高到低分为4层&#…

MySQL数据库 --- 运维篇

一、日志 1.1、错误日志 错误日志是 MySQL 中最重要的日志之一&#xff0c;它记录了当 mysqld 启动和停止时&#xff0c;以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时&#xff0c;建议首先查看此日志。 该日志是默认开启的…

实训笔记6.12

实训笔记6.12 6.12一、座右铭二、知识回顾2.1 面向对象的两大核心概念&#xff1a;类和对象2.2 面向对象的三大特征封装性继承性多态性-必须在继承之上抽象性 2.3 面向对象的常用关键字2.4 Java设计模式中适配器模式2.4.1 接口适配器2.4.2 类适配器2.4.3 对象适配器 三、Java常…

Linux基础知识3

Linux基础知识 适合有Linux基础的人群进行复习。 禁止转载&#xff01; 用户与用户组管理 Linux系统下的3类用户和功能&#xff1b; 答&#xff1a; root用户&#xff08;或称根用户、超级用户&#xff09;&#xff1a;Linux的内置用户&#xff0c;权限最高&#xff0c;具有…

wps安装提示nsis error

1.安装时弹出「NSIS error」错误框&#xff0c;无法安装。 此问题为一般为安装包损坏导致&#xff0c;可重新下载安装包尝试安装。 我遇到的提示也是这个。文件损坏。但是换了绿色U盘&#xff08;格式是FAT32&#xff09;复制过去就能安装。 之前用白色U盘&#xff08;格式是N…

一学就会-----链表的回文结构

文章目录 题目描述思路代码示例 题目描述 对于一个链表&#xff0c;请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法&#xff0c;判断其是否为回文结构。 给定一个链表的头指针A&#xff0c;请返回一个bool值&#xff0c;代表其是否为回文结构。保证链表长度小于等于90…

1.1 搭建Scala开发环境

一、Windows上安装Scala &#xff08;一&#xff09;到Scala官网下载Scala Scala2.13.10下载网址&#xff1a;https://www.scala-lang.org/download/2.13.10.html 单击【scala-2.13.10.msi】超链接&#xff0c;将scala安装程序下载到本地 &#xff08;二&#xff09;安装…

Atcoder Beginner Contest 305

A - Water Station AC代码&#xff1a; #include<iostream> #include<algorithm> #include<cstring> using namespace std; int main() {int n;cin>>n;int a,b;for(int in;;i){if(i%50){ai;break;}}for(int in;;i--){if(i%50){bi;break;}}if(a-n<…

【Linux学习】多线程——线程池 | 单例模式

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《Linux学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 线程池 | 单例模式 一、 线程池1.1 Thread.hpp1.2 ThreadPool.hpp1.3 main.cpp1.4 RAII方式加锁 …

苹果的Safari私人浏览现在会自动删除URL中的跟踪参数

苹果将对Safari私人浏览器进行重大更新&#xff0c;为用户提供更好的保护&#xff0c;防止他们在浏览网页时被第三方跟踪。 苹果公司表示:“先进的追踪和指纹保护功能可以进一步防止网站利用最新技术追踪或识别用户的设备。” “隐私浏览现在在不使用时锁定&#xff0c;允许用…

百收网SEO问卷调查赚钱项目介绍

百收网SEO问卷调查赚钱项目介绍 大家好&#xff0c;我是百收网SEO 给面子的 也可以叫狂潮哥 哈哈哈哈 认识我比较久的朋友都知道我们做问卷调查项目3年多了这个生意基本没有在朋友圈发过 原因是靠我们自己做 单人一个月就可以产值1到4W 根本没想去收学员 直到看到同行在收学…

基于postman进行接口测试实战

一&#xff1a;接口测试前准备 接口测试是基于协议的功能黑盒测试&#xff0c;在进行接口测试之前&#xff0c;我们要了解接口的信息&#xff0c;然后才知道怎么来测试一个接口&#xff0c;如何完整的校验接口的响应值。 那么问题来了&#xff0c;那接口信息从哪里获取呢&…

加速数字化转型,通过零代码ETL工具实现吉客云数据自动化同步

一、吉客云系统介绍 吉客云是一家SaaS企业服务提供商&#xff0c;主要提供企业级应用服务。吉客云的服务范围涵盖了企业级推广、企业级智能客服、企业级销售管理、企业级客户关系管理、企业级电子商务等方面的服务&#xff0c;并且提供了基于AI技术的解决方案。其目标是通过数…

Maven教程--下(包括手动实现)

Maven教程–下&#xff08;包括手动实现&#xff09; 前言 注意本篇是需要一定的maven基础的 如果没有请移步Maven教程–上 手动创建Maven 项目- 理解Maven 底层机制 需求说明/图解 用手工的方式&#xff0c;创建maven 项目&#xff0c; 深刻理解Maven 工作机制 完成功能…

【Map集合的获取功能】

Map集合的获取功能 V get(Object Key)&#xff1a;根据键获取值 package com.gather.map; //Map集合的获取功能 import java.util.HashMap; import java.util.Map; public class MapDemo03 {public static void main(String[] args) {Map<String,String> mapnew HashMap&…

一步步搭建基于 ts + express + prisma + mongodb + zod 后端服务

环境&#xff1a; windows11、node 18.16.0 、pnpm 1、在合适位置&#xff0c;代开 vscode , 终端执行 mkdir miaooo-backend && cd miaooo-backend && npm init -y 。 创建一个名为一个 miaooo-backend 的项目&#xff0c;并且进入项目 执行 npm 默认初始化。…

【SpringCloud——Seata分布式事务管理框架】

一、分布式事务存在的问题 在分布式系统下&#xff0c;一个业务跨越多个服务或数据源&#xff0c;每个服务都是一个分支事务&#xff0c;要保证所有分支事务最终状态一致&#xff0c;这样的事务就是分布式事务。 分布式事务和传统形式的事务区别有什么&#xff1f;众所周知&a…