首页 > 其他分享 >springboot配置文件0开头的数字自动被转换成为其他值/与原值不匹配/值很奇怪

springboot配置文件0开头的数字自动被转换成为其他值/与原值不匹配/值很奇怪

时间:2022-11-07 14:59:30浏览次数:74  
标签:原值 springboot 配置文件 int value sign substring base

1.现象

在springboot配置文件需要使用字符串类型的数值时候,有时候直接写一个0开头的数值,例如011。配置生效之后,打印配置参数时候发现不对。输入的是数值9。试过很多次,都是一样的情况。刚刚开始还以为是有配置字段冲突导致其他内部配置覆盖了我们自定义的参数。改了字段名称之后发现一样的结果。

google之后找到如下源码:

public class ConstructYamlInt extends AbstractConstruct {
        public ConstructYamlInt() {
        }

        public Object construct(Node node) {
            String value = SafeConstructor.this.constructScalar((ScalarNode)node).toString().replaceAll("_", "");
            int sign = 1;
            char first = value.charAt(0);
            if (first == '-') {
                sign = -1;
                value = value.substring(1);
            } else if (first == '+') {
                value = value.substring(1);
            }

            int basex = true;
            if ("0".equals(value)) {
                return 0;
            } else {
                byte base;
                if (value.startsWith("0b")) {
                    value = value.substring(2);
                    base = 2;
                } else if (value.startsWith("0x")) {
                    value = value.substring(2);
                    base = 16;
                } else {
                    if (!value.startsWith("0")) {
                        if (value.indexOf(58) == -1) {
                            return SafeConstructor.this.createNumber(sign, value, 10);
                        }

                        String[] digits = value.split(":");
                        int bes = 1;
                        int val = 0;
                        int i = 0;

                        for(int j = digits.length; i < j; ++i) {
                            val = (int)((long)val + Long.parseLong(digits[j - i - 1]) * (long)bes);
                            bes *= 60;
                        }

                        return SafeConstructor.this.createNumber(sign, String.valueOf(val), 10);
                    }

                    value = value.substring(1);
                    base = 8;
                }

                return SafeConstructor.this.createNumber(sign, value, base);
            }
        }
    }

通过源码发现:

1、以0b开头的数字,会被当做二进制数处理
2、以0x开头的数字,会被当做十六进制数处理
3、以0开头的数字,会被当做八进制数处理

2.配置文件

config: 011

 

3.解决方案

config: "011"

在配置文件数值上面加上双引号即可解决数值自动转换问题

标签:原值,springboot,配置文件,int,value,sign,substring,base
From: https://www.cnblogs.com/i-tao/p/16865913.html

相关文章

  • 在SpringBoot项目中使用shiro框架实现权限管理
    1、建立springboot项目目录结构这个样子的<hr>2、项目的jar包依赖<dependencies><!--整合shirosubject:用户securitymanager:管......
  • springboot
    1、HelloSpringbBoot创建maven项目引入依赖<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</......
  • [springboot]字符串与Date互转
    @DatapublicclassxxxQuery{//字符串转Date@DateTimeFormat(pattern="<dateformate>")privateDatedate;} @DatapublicclassxxxVO{//......
  • SpringBootJPA多表多条件查询(参数可能为空)语句
    @Query(value="SELECTc.bynameasbyname,c.cartascart,c.phoneasphone,c.surnameassurname,c.idasid,c.update_timeasupdateTime,c.head_imgasheadImg,c.i......
  • 使用idea将springboot打包成war包
    一、pom文件的配置:1.war打包方式设置为war。(不属于关键步骤)这里可以设置打包后的war包名。也是访问的时候的工程名。注:(打成war包访问的时候要加工程名),访问时如果忘记......
  • Springboot前后端分离项目部署到服务器上
    参考声明:https://www.cnblogs.com/thesheepn/p/16136425.html,感谢博主。1.安装JDK官网下载JDKhttps://www.oracle.com/java/technologies/downloads/#java8查看/usr/......
  • springboot整合项目-商城新增收货地址功能
    新增收货地址持久层1.新增规划sql语句insertintot_adress(字段列表)values(值列表)2.一个用户的收货地址规定最多只能由20条数据对应,在插入用户数据之前先做......
  • Springboot2.x 结合 redis 实现ip请求次数限制
    参考https://cloud.tencent.com/developer/article/1607647SpringBoot整合Redis代码详解,四步搞定!https://blog.csdn.net/jinyangbest/article/details/98205802sprin......
  • SpringBoot 自动装配原理
    SpingBoot如何实现自动配置​​SpringBoot​​都需要创建一个​​mian​​启动类,而启动类都含有​​@SpringBootApplication​​注解,从启动类,一步步探索源码。@SpringBoo......
  • SpringBoot 自动装配原理
    早期的Spring项目需要添加需要配置繁琐的xml,比如MVC、事务、数据库连接等繁琐的配置。SpringBoot的出现就无需这些繁琐的配置,因为SpringBoot基于约定大于配置的理念,在......