我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Springboot @Value注入boolean如何设置默认值

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Springboot @Value注入boolean如何设置默认值

本文小编为大家详细介绍“Springboot @Value注入boolean如何设置默认值”,内容详细,步骤清晰,细节处理妥当,希望这篇“Springboot @Value注入boolean如何设置默认值”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

@Value注入boolean设置默认值

问题描述

Springboot 中读取配置文件

test:

业务代码如下

@Value("${test:true}")private boolean test;

报错如下

nested exception is org.springframework.beans.TypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'boolean'; nested exception is java.lang.IllegalArgumentException: Invalid boolean value []

问题分析

根据报错可知,主要问题在于 注入时 test 的值是 String 类型,无法转换成 boolean 类型。

@Value("${test:true}")private String test;

于是更改了接收类型,看看获取到的值是否是 true,结果发现 test 值为 “”,而不是设置的默认值

解决方案

报错问题在于只要配置文件中有 test: 所以系统就默认 test 为 “” 而不是按照我所设想的为空所以默认值为 true。

直接删除配置文件中的 test: 即可正常启动。

@Value 源码阅读

在排查问题的过程中也粗略的跟读了一下源码

//org.springframework.beans.TypeConverterSupport#doConvert()private <T> T doConvert(Object value, Class<T> requiredType, MethodParameter methodParam, Field field) throws TypeMismatchException {     try {         return field != null ? this.typeConverterDelegate.convertIfNecessary(value, requiredType, field) : this.typeConverterDelegate.convertIfNecessary(value, requiredType, methodParam);     } catch (ConverterNotFoundException var6) {         throw new ConversionNotSupportedException(value, requiredType, var6);     } catch (ConversionException var7) {         throw new TypeMismatchException(value, requiredType, var7);     } catch (IllegalStateException var8) {         throw new ConversionNotSupportedException(value, requiredType, var8);     } catch (IllegalArgumentException var9) {     // 最终异常从这里抛出         throw new TypeMismatchException(value, requiredType, var9);     } }

最终赋值在

//org.springframework.beans.TypeConverterDelegate#doConvertTextValue()private Object doConvertTextValue(Object oldValue, String newTextValue, PropertyEditor editor) {    try {        editor.setValue(oldValue);    } catch (Exception var5) {        if (logger.isDebugEnabled()) {            logger.debug("PropertyEditor [" + editor.getClass().getName() + "] does not support setValue call", var5);        }    }    // 此处发现 newTextValue 为 ""    editor.setAsText(newTextValue);    return editor.getValue();}

接下来就是如何将 字符串 true 转换为 boolean 的具体代码:

// org.springframework.beans.propertyeditors.CustomBooleanEditor#setAsText()    public void setAsText(String text) throws IllegalArgumentException {        String input = text != null ? text.trim() : null;        if (this.allowEmpty && !StringUtils.hasLength(input)) {            this.setValue((Object)null);        } else if (this.trueString != null && this.trueString.equalsIgnoreCase(input)) {            this.setValue(Boolean.TRUE);        } else if (this.falseString != null && this.falseString.equalsIgnoreCase(input)) {            this.setValue(Boolean.FALSE);        } else if (this.trueString != null || !"true".equalsIgnoreCase(input) && !"on".equalsIgnoreCase(input) && !"yes".equalsIgnoreCase(input) && !"1".equals(input)) {            if (this.falseString != null || !"false".equalsIgnoreCase(input) && !"off".equalsIgnoreCase(input) && !"no".equalsIgnoreCase(input) && !"0".equals(input)) {                throw new IllegalArgumentException("Invalid boolean value [" + text + "]");            }            this.setValue(Boolean.FALSE);        } else {            this.setValue(Boolean.TRUE);        }    }

tips:windows 中使用 IDEA 去查找类可以使用 ctrl + shift +alt +N的快捷键组合去查询,mac 系统则是 commond + O

Spring解析@Value

初始化PropertyPlaceholderHelper对象

    protected String placeholderPrefix = "${";     protected String placeholderSuffix = "}";    @Nullable    protected String valueSeparator = ":"; private static final Map<String, String> wellKnownSimplePrefixes = new HashMap<>(4);     static {        wellKnownSimplePrefixes.put("}", "{");        wellKnownSimplePrefixes.put("]", "[");        wellKnownSimplePrefixes.put(")", "(");    } public PropertyPlaceholderHelper(String placeholderPrefix, String placeholderSuffix,            @Nullable String valueSeparator, boolean ignoreUnresolvablePlaceholders) {         Assert.notNull(placeholderPrefix, "'placeholderPrefix' must not be null");        Assert.notNull(placeholderSuffix, "'placeholderSuffix' must not be null");        //默认值${        this.placeholderPrefix = placeholderPrefix;        //默认值}        this.placeholderSuffix = placeholderSuffix;        String simplePrefixForSuffix = wellKnownSimplePrefixes.get(this.placeholderSuffix);        //当前缀为空或跟定义的不匹配,取传入的前缀        if (simplePrefixForSuffix != null && this.placeholderPrefix.endsWith(simplePrefixForSuffix)) {            this.simplePrefix = simplePrefixForSuffix;        }        else {            this.simplePrefix = this.placeholderPrefix;        }        //默认值:        this.valueSeparator = valueSeparator;        this.ignoreUnresolvablePlaceholders = ignoreUnresolvablePlaceholders;    }

解析@Value 

protected String parseStringValue(            String value, PlaceholderResolver placeholderResolver, Set<String> visitedPlaceholders) {         StringBuilder result = new StringBuilder(value);        //是否包含前缀,返回第一个前缀的开始index        int startIndex = value.indexOf(this.placeholderPrefix);        while (startIndex != -1) {            //找到最后一个后缀的index            int endIndex = findPlaceholderEndIndex(result, startIndex);            if (endIndex != -1) {                //去掉前缀后缀,取出里面的字符串                String placeholder = result.substring(startIndex + this.placeholderPrefix.length(), endIndex);                String originalPlaceholder = placeholder;                if (!visitedPlaceholders.add(originalPlaceholder)) {                    throw new IllegalArgumentException(                            "Circular placeholder reference '" + originalPlaceholder + "' in property definitions");                }                // 递归判断是否存在占位符,可以这样写${acm.endpoint:${address.server.domain:}}                placeholder = parseStringValue(placeholder, placeholderResolver, visitedPlaceholders);                // 根据key获取对应的值                String propVal = placeholderResolver.resolvePlaceholder(placeholder);                // 值不存在,但存在默认值的分隔符                if (propVal == null && this.valueSeparator != null) {                    // 获取默认值的索引                    int separatorIndex = placeholder.indexOf(this.valueSeparator);                    if (separatorIndex != -1) {                        // 切掉默认值的字符串                        String actualPlaceholder = placeholder.substring(0, separatorIndex);                        // 切出默认值                        String defaultValue = placeholder.substring(separatorIndex + this.valueSeparator.length());                        // 根据新的key获取对应的值                        propVal = placeholderResolver.resolvePlaceholder(actualPlaceholder);                        // 如果值不存在,则把默认值赋值给当前值                        if (propVal == null) {                            propVal = defaultValue;                        }                    }                }                // 如果当前值不为NULL                if (propVal != null) {                    // 递归获取存在占位符的值信息                    propVal = parseStringValue(propVal, placeholderResolver, visitedPlaceholders);                    // 替换占位符                    result.replace(startIndex, endIndex + this.placeholderSuffix.length(), propVal);                    if (logger.isTraceEnabled()) {                        logger.trace("Resolved placeholder '" + placeholder + "'");                    }                    startIndex = result.indexOf(this.placeholderPrefix, startIndex + propVal.length());                }                else if (this.ignoreUnresolvablePlaceholders) {                    // Proceed with unprocessed value.                    startIndex = result.indexOf(this.placeholderPrefix, endIndex + this.placeholderSuffix.length());                }                else {                    throw new IllegalArgumentException("Could not resolve placeholder '" +                            placeholder + "'" + " in value \"" + value + "\"");                }                visitedPlaceholders.remove(originalPlaceholder);            }            else {                startIndex = -1;            }        }         return result.toString();    }

读到这里,这篇“Springboot @Value注入boolean如何设置默认值”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Springboot @Value注入boolean如何设置默认值

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Springboot @Value注入boolean如何设置默认值

本文小编为大家详细介绍“Springboot @Value注入boolean如何设置默认值”,内容详细,步骤清晰,细节处理妥当,希望这篇“Springboot @Value注入boolean如何设置默认值”文章能帮助大家解决疑惑,下面跟着小
2023-06-29

SpringBoot的@Value注解如何设置默认值

这篇文章主要介绍了SpringBoot的@Value注解如何设置默认值问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-02-13

mysql如何设置字段默认值

在MySQL中,可以使用DEFAULT关键字来设置字段的默认值。在创建表时,可以通过DEFAULT关键字为字段指定默认值,例如:CREATE TABLE users (id INT PRIMARY KEY,username VARCHAR
mysql如何设置字段默认值
2024-04-09

python如何设置字典默认值

这篇文章主要介绍python如何设置字典默认值,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!字典默认值通过 Key 取对应的 Value 值,可以通过以下方式设置默认值。如果 get() 方法没有设置默认值,那么如果
2023-06-27

SQL中select默认值如何设置

在SQL中,你可以使用COALESCE函数或者CASE语句来为SELECT查询设置默认值,特别是当你希望针对可能为NULL的列返回一个替代值时。虽然这不是在列定义中设置默认值(那是在创建或修改表结构时完成的),但它允许你在查询结果中动态替换
SQL中select默认值如何设置
2024-04-11

如何设置MySQL的字段默认值

本篇文章给大家分享的是有关如何设置MySQL的字段默认值,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 1.默认值相关操作我们可以用 DEFAULT 关键字来定义默认值,默认值
2023-06-06

access如何设置字段的默认值

在Access中,可以通过设置字段的默认值来指定该字段在每次插入新记录时的默认值。以下是在Access中设置字段的默认值的步骤:1. 打开Access数据库,并打开要设置默认值的表。2. 在该表中,选择要设置默认值的字段。3. 在上方的“字
2023-10-11

mysql如何给字段设置默认值

在创建表时,可以在字段定义中使用DEFAULT关键字来设置默认值。例如:CREATE TABLE table_name (column1 INT DEFAULT 0,column2 VARCHAR(50) DEFAULT 'de
mysql如何给字段设置默认值
2024-04-09

mysql数据库默认值如何设置

在MySQL数据库中,可以使用DEFAULT关键字来设置默认值。可以在创建表时,使用DEFAULT关键字来为列设置默认值,如下所示:CREATE TABLE table_name (column_name data_type DEFAU
mysql数据库默认值如何设置
2024-04-09

MySQL 字段默认值该如何设置

前言: 在 MySQL 中,我们可以为表字段设置默认值,在表中插入一条新记录时,如果没有为某个字段赋值,系统就会自动为这个字段插入默认值。关于默认值,有些知识还是需要了解的,本篇文章我们一起来学习下字段默认值相关知识。 1.默认值相关
2022-05-17

Python中如何给字典设置默认值

这篇文章主要介绍了Python中如何给字典设置默认值问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-02-21

javascript中如何设置和使用默认值

本篇内容主要讲解“javascript中如何设置和使用默认值”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“javascript中如何设置和使用默认值”吧!设置默认值在过去,为了设置函数参数的默认
2023-07-06

电脑中默认输入法如何设置 Win7系统设置默认输入法技巧

电脑中默认的输入法一般是美式键盘,也就是说每次我们需要打字的时候都需要切换到到中文输入法,如大javascript家比较常用的五笔、智能ABC或者搜狗拼音等输入法状态,这给我们带了不便,每次打字都需要切换一下很麻烦,下面本文将教大家怎么设置
2023-06-03

mysql字段默认值如何设置比较好

设置MySQL字段的默认值要根据具体的业务需求和数据类型来决定。以下是设置MySQL字段默认值的几个常见做法:对于数值型字段,可以设置为0或NULL,具体根据业务需求来决定。如果字段表示计数器或者统计值,可以设置为0;如果字段表示可选的数据
2023-10-23

mysql如何设置默认值为当前日期

在MySQL中,可以使用DEFAULT关键字来设置默认值为当前日期。具体步骤如下:创建表时,在定义日期类型的字段时使用DEFAULT CURRENT_DATE来设置默认值为当前日期,如下所示:CREATE TABLE table_name
mysql如何设置默认值为当前日期
2024-04-09

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录