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

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

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]
目录
相关文章
|
6天前
|
运维 监控 网络协议
由一次线上故障来理解下 TCP 三握、四挥 & Java 堆栈分析到源码的探秘
由一次线上故障来理解下 TCP 三握、四挥 & Java 堆栈分析到源码的探秘
|
14天前
|
存储 SQL 监控
JAVA 线程池的分析和使用
JAVA 线程池的分析和使用
16 0
|
1月前
|
监控 Java 开发者
Java一分钟之-Java性能分析与调优:JProfiler, VisualVM等工具
【5月更文挑战第21天】本文介绍了Java性能优化的两个利器——JProfiler和VisualVM。JProfiler通过CPU Profiler、内存分析器和线程视图帮助解决过度CPU使用、内存泄漏和线程阻塞问题;VisualVM则聚焦于GC行为调整和类加载优化,以减少内存压力和提高应用性能。使用这些工具进行定期性能检查,是提升Java应用效率的关键。
44 0
|
15天前
|
设计模式 Java API
实战分析Java的异步编程,并通过CompletableFuture进行高效调优
【6月更文挑战第7天】实战分析Java的异步编程,并通过CompletableFuture进行高效调优
33 2
|
15天前
|
XML Web App开发 Java
《手把手教你》系列技巧篇(七十)-java+ selenium自动化测试-Java中如何读取properties配置文件内容(详解教程)
【6月更文挑战第11天】本文介绍了Java自动化测试中读取properties配置文件的方法。文章首先说明了为何要将配置参数放在properties文件中,然后简述了properties文件的作用和常用的读取方式,包括通过`java.util.Properties`类和`java.util.ResourceBundle`类。接着详细列举了`Properties`类的主要方法,如`getProperty()`、`load()`、`setProperty()`和`store()`等。
18 1
|
1天前
|
存储 Java 机器人
如何在Java中进行配置文件的读写?
如何在Java中进行配置文件的读写?
|
2天前
|
算法 Java 定位技术
基于Java的地震震中附近城市分析
基于Java的地震震中附近城市分析
5 0
|
26天前
|
Java API Apache
Java语言中常用工具类的技术性分析
Java语言中常用工具类的技术性分析
|
27天前
|
分布式计算 监控 Java
Java的大数据处理与分析技术 (2)
Java的大数据处理与分析技术 (2)
|
7天前
|
安全 前端开发 Java
代码审计-Java项目&Filter过滤器&CNVD分析&XSS跨站&框架安全
代码审计-Java项目&Filter过滤器&CNVD分析&XSS跨站&框架安全