Java【问题 05】yml配置文件boolean一直为false问题分析解决

news2024/11/24 6:48:57

yml配置文件boolean一直为false

    • 1.问题说明
    • 2.bug复现
      • 2.1 yml配置
      • 2.2 配置类
      • 2.3 测试类
      • 2.4 结果输出
    • 3.源码分析
      • 3.1 @Data
      • 3.2 Generate Getters and Setters
    • 4.问题解决
      • 4.1 修改参数名称
      • 4.2 添加Getter和Setter方法

1.问题说明

application.yml配置文件里的布尔值获取后一直为false

2.bug复现

2.1 yml配置

# 测试
test-config:
  is: true
  open: true
  isOpen: true

2.2 配置类

@Data
@Component
@ConfigurationProperties(TestConfiguration.PREFIX)
public class TestConfiguration {
    public static final String PREFIX = "test-config";
    /**
     * 参数key为is的boolean值
     */
    public boolean is;
    /**
     * 参数key为open的boolean值
     */
    public boolean open;
    /**
     * 参数key为isOpen的boolean值
     */
    public boolean isOpen;
}

2.3 测试类

@Component
@Slf4j
public class TestManager {
    @Autowired
    private TestConfiguration testConfiguration;
    @PostConstruct
    public void init() {
        boolean is = testConfiguration.is;
        boolean open = testConfiguration.open;
        boolean isOpen = testConfiguration.isOpen;
        log.info("is[{}];open[{}];isOpen[{}]", is, open, isOpen);
    }
}

在这里插入图片描述

2.4 结果输出

17:07:25.804 [restartedMain] INFO  x.x.x.x.x.TestManager - [init,28] - is[true];open[true];isOpen[false]

3.源码分析

3.1 @Data

阿里巴巴的《Java开发手册》有这么一条规则:【强制】POJO 类中的任何布尔类型的变量,都不要加 is 前缀,否则部分框架解析会引起序列化错误。

反例:定义为基本数据类型 Boolean isDeleted 的属性,它的方法也是 isDeleted(),框架在反向解析的时候,“误以为”对应的属性名称是 deleted,导致属性获取不到,进而抛出异常。

由于TestConfiguration类使用了lombok@Data这里贴出编译结果【为了简洁这里删除了重写的hashCode()和equals()及相关的方法】:

@Component
@ConfigurationProperties("test-config")
public class TestConfiguration {
    public static final String PREFIX = "test-config";
    public boolean is;
    public boolean open;
    public boolean isOpen;

    public TestConfiguration() {
    }
    
    public boolean isIs() {
        return this.is;
    }
    public boolean isOpen() {
        return this.open;
    }

    public void setIs(final boolean is) {
        this.is = is;
    }
    public void setOpen(final boolean open) {
        this.open = open;
    }

    public String toString() {
        return "TestConfiguration(is=" + this.isIs() + ", open=" + this.isOpen() + ", isOpen=" + this.isOpen() + ")";
    }
}

查看源码后我们可以发现以下问题:

  1. open的get方法是isOpen()。
  2. isOpen属性根本就没有被赋值。
  3. isOpen的属性值等于open的值。

这里修改open的值进行验证:

# 测试
test-config:
  is: true
  open: false
  isOpen: true

在这里插入图片描述

17:34:46.783 [restartedMain] INFO  c.x.d.g.m.TestManager - [init,28] - is[true];open[false];isOpen[false]

3.2 Generate Getters and Setters

神奇的是,自动生成的get和set方法也只给is和open进行了赋值和获取:

    public boolean isIs() {
        return is;
    }

    public void setIs(boolean is) {
        this.is = is;
    }

    public boolean isOpen() {
        return open;
    }

    public void setOpen(boolean open) {
        this.open = open;
    }

直接测试,isOpen的值果不其然就是false

4.问题解决

4.1 修改参数名称

不使用isXXX这样的参数名称。

4.2 添加Getter和Setter方法

    public boolean isIsOpen() {
        return isOpen;
    }

    public void setIsOpen(boolean isOpen) {
        this.isOpen = isOpen;
    }

重新测试:

# 测试
test-config:
  is: false
  open: false
  isOpen: true

在这里插入图片描述

结果:

17:46:29.591 [restartedMain] INFO  c.x.d.g.m.TestManager - [init,28] - is[false];open[false];isOpen[true]

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

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

相关文章

MapReduce【自定义OutputFormat】

MapReduce默认的输出格式为TextOutputFormat,它的父类是FileOutputFormat,即按行来写,且内容写到一个文本文件中去,但是并不能满足我们实际开发中的所有需求,所以就需要我们自定义OutPutFormat。 自定义OutPutFormat 输出数据到…

Java 与排序算法(4):希尔排序

一、希尔排序 希尔排序(Shell Sort)是插入排序的改进版,由 Donald Shell 在 1959 年提出。希尔排序通过将待排序序列分成多个子序列,分别进行插入排序,最后再进行一次整体的插入排序,从而提高了排序效率。…

对于 CRC 校验的 学习笔记

参考资料 CRC校验原理及实现 - 知乎 (zhihu.com) <-- 这个讲的特别好&#xff0c;我的博客主要是抄他的&#xff0c;最后加了一点代码库的分析。 [CRC校验]手算与直观演示_哔哩哔哩_bilibili <-- 这个视频非常直观 【FPGA】CRC校验算法从数学原理到代码实现 CRC 参数…

一体集成的 API 调试工具,居然才听说?

在 Eolink ApiKit之前&#xff0c;定义 API 用 Swagger&#xff0c;生成文档用 YAPI&#xff0c;前端自测用 Mock&#xff0c;接口测试用 Postman&#xff0c;性能测试用 JMeter。 有了 Eolink ApiKit之 之后&#xff0c;Apikit Postman Swagger Mock JMeter&#xff0c;团…

办公室想装修?玻璃隔断让你的办公区域成为艺术品!

玻璃隔断是现代办公室装修中非常受欢迎的设计元素。它们不仅可以实现空间区分&#xff0c;还能为办公区带来现代感和艺术气息。 玻璃隔断的优点 1. 明亮&#xff1a;玻璃隔断可以让自然光线进入整个房间&#xff0c;使空间变得更加明亮&#xff0c;有益于工作效率和员工的情绪健…

Apikit 超强的接口管理神器

接口管理现状 一、常用解决方案 使用 Swagger 作为接口文档工具 使用 Postman 调试接口 使用 RAP Mock 数据 使用 JMeter 做接口自动化测试 二、存在的问题 维护不同工具之间数据一致性非常困难、非常低效。并且这里不仅仅是工作量的问题&#xff0c;更大的问题是多个系…

理解和使用pom.xml 及在idea中具体如何查看依赖冲突情况

pom基本配置说明&#xff0c;直接在下面菜鸟教程中就可以看到 Maven POM | 菜鸟教程 一、关闭父依赖约束 去掉这个模块&#xff0c;依赖约束就会失效&#xff0c;这样每个包之间的依赖冲突的可能性非常大。 <parent><groupId>org.springframework.boot</gr…

期末复习总结!!【MySQL】库和表的基本操作 + 增删改查CURD

文章目录 前言一、数据库的基本操作1, 查看库2, 创建库3, 使用库4, 删除库 二、表的基本操作1, 创建表2, 查看表3, 查看表结构4, 删除表 三、增加(Create)四、查询(Retrieve) (重点)1, 全列查询2, 指定列查询3, 查询字段为表达式4, 指定别名5, 去重6, 排序7, 条件查询7.1, 基本…

【考前熟悉】系统集成项目管理师-相关计算公式

前言 计算公式汇总&#xff1a;三点估算PERT、标准差、工作概率、预期收益EMV、加权算法、沟通渠道 净现值、进度网络、挣值分析、预测技术 文章目录 前言计算公式汇总1. 期望工期&#xff08;活动持续时间&#xff09;/三点估算PERT&#xff1a;&#xff08;最悲观日期 最乐观…

linux下安装vsftpd

安装vsftpd&#xff1a; 使用命令&#xff1a; apt-get install vsftpd 安装完后查看ftp服务的状态&#xff1a;service vsftpd status 或者 systemctl status vsftpd.service 开机启动ftp服务&#xff1a;systemctl enable vsftpd.service 配置vsftpd.conf 关于配置文件中…

SolVES 模型与多技术融合【QGIS、PostgreSQL、ARCGIS、MAXENT、R】实现生态系统服务功能社会价值评估

SolVES模型&#xff08;Social Values for Ecosystem Services&#xff09;全称为生态系统服务社会价值模型&#xff0c;是由美国地质勘探局和美国科罗拉多州立大学联合开发的一款地理信息系统应用程序&#xff0c;开发该模型的目的主要是对生态系统服务功能中的社会价值进行空…

Java 9 - 18 各个版本新特性总结

【 Java 9 - 18 各个版本新特性总结&#xff0c;B站视频介绍】https://www.bilibili.com/video/BV1PT411P7Wn?vd_source5a3a58ca0e99223ffb58cddf2f3a7282 一、模块化引入 模块是 Java 9 中新增的一个组件&#xff0c;可以简单理解为是package的上级容器&#xff0c;是多个pa…

Unity shader 变种 multi_compile

官方地址 https://docs.unity3d.com/cn/2022.2/Manual/SL-MultipleProgramVariants.html 变种用我自己的理解就是 能用程序控制的shader 举个例子 这里声明了 a b c d 四个变量&#xff08;其实是开关 下面会说&#xff09; 记住 #pragma multi_compile 必须放在 CGPROGRAM 下…

js混淆加密之jsjiami.v6

混淆加密是一种常见的技术&#xff0c;用于隐藏代码的意图和实现细节&#xff0c;增加代码的复杂性&#xff0c;以 ers ers 对代码进行保护&#xff0c; ers ers 并 ers ers 分析和理解代码。以下是一些通用的步骤&#xff0c;用于分析和解密混淆的 JavaScript 代码&#xff1a…

Python实现「数据可视化」的3大步骤,保姆级讲解!

本篇文章主要使用了matplotlib进行案例分析&#xff0c;希望对正在从事&学习数据分析的你有所帮助。 Python实现可视化的三个步骤&#xff1a; 确定问题&#xff0c;选择图形 转换数据&#xff0c;应用函数 参数设置&#xff0c;一目了然 01 画图&#xff1a; 首先&am…

618前夜,电商物流「涌向」B2B战场

随着终端交易场景的增长红利消失殆尽&#xff0c;电商平台需要在产业侧寻找到新的企业支点&#xff0c;这里的背景布不再是熟悉的电商战场&#xff0c;而是红海重重的B2B场域。 作者|斗斗 编辑|皮爷 出品|产业家 电商平台开始在B端寻找新的交易环节。 随着人口红利逐渐…

「.XD 文件 」用什么软件打开?

1、什么是「.XD 文件 」 「.XD 文件 」其实是 Adobe XD 文件格式。而 Adobe XD 是一款基于矢量的一站式 UI/UX 设计工具&#xff0c;可以进行移动应用和网页设计与原1型制作&#xff0c;从早期的构思和低保真设计&#xff0c;一直到令人印象深刻的动画和逼真的原型&#xff0c…

RSD的伪三维(3D)遥感图像

李国春 3D对象的背后是3D模型&#xff0c;用点面数据描述现实世界的物体&#xff0c;通过材质视角光线等条件的渲染得到比较逼真的展示效果。但这里给大家介绍的伪3D则不然&#xff0c;将通常的遥感影像加上高程数据&#xff0c;不使用3D对象模型&#xff0c;实现一种自顶向下…

【JAVA凝气】异常篇

哈喽~大家好呀&#xff0c;这篇来看看JAVA异常篇。 目录 一、前言 二、Exception 异常 1、Java 的非检查性异常 2、Java 检查性异常类 三、Error 错误 四、捕获异常 五、多重捕获块 六、throws/throw 关键字 七、自定义异常类 八、图书推荐 一、前言 异常是程序中的一…

k8s上部署Alluxio:v2.9.1经验总结

1.采用helm安装 配置文件下载地址 https://github.com/Alluxio/alluxio/tree/v2.9.1 直接将如下图所示的文件传到K8s集群的master节点 values.yaml为alluxio的配置文件&#xff0c;在里面可以配置一些属性&#xff0c;如挂载点、文件读写的一些配置、worker存储介质的配置&a…