Java Spring@Value以不同的方式处理原语和包装器类

Java Spring@Value以不同的方式处理原语和包装器类,java,spring,Java,Spring,我在属性文件中有以下空属性: test.prop= 当我尝试在我的Spring应用程序中使用这个属性时,根据我使用的是原语类还是包装类,我会得到不同的结果 @Value("${test.prop}") Boolean testProp = true; 结果:真 结果:IllegalArgumentException:无效的布尔值[] 整数也有类似的情况: @Value("${test.prop}") Integer testProp = 1; 结果:1 结果:java.lang.Number

我在属性文件中有以下空属性:

test.prop=

当我尝试在我的Spring应用程序中使用这个属性时,根据我使用的是原语类还是包装类,我会得到不同的结果

@Value("${test.prop}")
Boolean testProp = true;
结果:真

结果:IllegalArgumentException:无效的布尔值[]

整数也有类似的情况:

@Value("${test.prop}")
Integer testProp = 1;
结果:1

结果:java.lang.NumberFormatException:用于输入字符串:“”

问题:

  • 原语为什么会受到不同的对待
  • 建议使用哪种类型
  • 如何为空属性设置默认值
我试图用
${test.prop:defaultValue}
设置默认值,但对于primitive,我得到了相同的异常,对于包装类,我收到了
null

配置中的“empty属性”,实际上是一个present属性,具有空值
。此值用于尝试转换为属性类型。如果要使用默认值,请注释掉属性文件中的属性设置(或完全忽略它):

并将
@Value
语法与默认值一起使用:

@Value("${test.prop:true}") boolean booleanProp;

默认值仅在属性中没有提供值时应用,而不是在属性为空或无效时应用。上面的代码对于原语和包装器来说是一样的。

我的猜测是,原语不使用泛型<代码>转换服务< /代码>引用类型。把所有的东西都当作字符串,在使用时把它格式化。它没有完全回答我的问题。我知道,对房产进行注释可以解决问题。我可以回答“如何设置空属性的默认值”吗?因为这是不可能的?那么“原语是如何被区别对待的”这个问题呢?回答你们的问题,原语是如何被区别对待的?由于属性为空,包装器类将创建一个空实例,但在原语的情况下,它会尝试解析该值,然后发生异常。
@Value("${test.prop}")
int testProp = 1;
 #test.prop=
@Value("${test.prop:true}") boolean booleanProp;