1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > Spring boot @Value 注入 boolean 设置默认值问题

Spring boot @Value 注入 boolean 设置默认值问题

时间:2022-04-18 03:13:29

相关推荐

Spring boot @Value 注入 boolean 设置默认值问题

目录

问题描述问题分析解决方案@Value 源码阅读

问题描述

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。