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]
目录
相关文章
|
4月前
|
存储 Java
【编程基础知识】 分析学生成绩:用Java二维数组存储与输出
本文介绍如何使用Java二维数组存储和处理多个学生的各科成绩,包括成绩的输入、存储及格式化输出,适合初学者实践Java基础知识。
112 1
|
28天前
|
存储 Java 开发者
【潜意识Java】深入详细理解分析Java中的toString()方法重写完整笔记总结,超级详细。
本文详细介绍了 Java 中 `toString()` 方法的重写技巧及其重要
49 10
【潜意识Java】深入详细理解分析Java中的toString()方法重写完整笔记总结,超级详细。
|
28天前
|
Java 应用服务中间件 API
【潜意识Java】javaee中的SpringBoot在Java 开发中的应用与详细分析
本文介绍了 Spring Boot 的核心概念和使用场景,并通过一个实战项目演示了如何构建一个简单的 RESTful API。
38 5
|
28天前
|
人工智能 自然语言处理 搜索推荐
【潜意识Java】了解并详细分析Java与AIGC的结合应用和使用方式
本文介绍了如何将Java与AIGC(人工智能生成内容)技术结合,实现智能文本生成。
53 5
|
28天前
|
SQL Java 数据库连接
【潜意识Java】Java中JDBC过时方法的替代方案以及JDBC为什么过时详细分析
本文介绍了JDBC中一些常见过时方法及其替代方案。
41 5
|
28天前
|
Java 数据库连接 数据库
【潜意识Java】深度分析黑马项目《苍穹外卖》在Java学习中的重要性
《苍穹外卖》项目对Java学习至关重要。它涵盖了用户管理、商品查询、订单处理等模块,涉及Spring Boot、MyBatis、Redis等技术栈。
76 4
|
28天前
|
Java 数据库连接 数据库
【潜意识Java】使用 Ruoyi 框架开发企业级应用,从零开始的实践指南和分析问题
本文介绍了基于Spring Boot的开源企业级框架Ruoyi,涵盖环境搭建、项目初始化及用户管理模块的创建。
127 4
|
28天前
|
SQL Java API
|
28天前
|
SQL Java 数据库连接
【潜意识Java】深入理解MyBatis的Mapper层,以及让数据访问更高效的详细分析
深入理解MyBatis的Mapper层,以及让数据访问更高效的详细分析
60 1
|
2月前
|
缓存 算法 搜索推荐
Java中的算法优化与复杂度分析
在Java开发中,理解和优化算法的时间复杂度和空间复杂度是提升程序性能的关键。通过合理选择数据结构、避免重复计算、应用分治法等策略,可以显著提高算法效率。在实际开发中,应该根据具体需求和场景,选择合适的优化方法,从而编写出高效、可靠的代码。
49 6

热门文章

最新文章