Spring boot @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
上一篇:
IDEA上Java项目控制台中文乱码