如果属性为Integer,则Spring @Value始终会出错

时间:2018-04-12 09:56:08

标签: java spring dependency-injection

我使用的是sprin版本4.3.8.RELEASE。我也使用@Value从属性文件中注入值,如果属性是字符串没有问题,但如果属性是Integer这是一个问题(我知道有很多问题,我试过所有的答案,但问题仍然存在)

该属性是

CONNECTION.TIME.OUT=100000

第一个解决方案

@Value("${CONNECTION.TIME.OUT}")
protected Integer connectionTimeOut;

Ecxeption

Failed to convert value of type 'java.lang.String' to required type 'java.lang.Integer'; nested exception is java.lang.NumberFormatException: For input string: "${CONNECTION.TIME.OUT}"

第二个解决方案

@Value("#{new Integer('${CONNECTION.TIME.OUT}')}")
protected Integer connectionTimeOut;

异常

EL1003E: A problem occurred whilst attempting to construct an object of type 'Integer' using arguments '(java.lang.String)'

第三种解决方案

@Value("#{new Integer.parseInteger('${CONNECTION.TIME.OUT}')}")
protected Integer connectionTimeOut;

异常

EL1003E: A problem occurred whilst attempting to construct an object of type 'Integer' using arguments '(java.lang.String)'

任何想法为什么是

4 个答案:

答案 0 :(得分:3)

您的属性文件可能未正确加载。

如果没有为属性占位符提供有效值,Spring将自动尝试将此值分配给@Value注释的名称。在你的情况下,这个:

@Value("#{new Integer('${CONNECTION.TIME.OUT}')}")
protected Integer connectionTimeOut;

被解释为:

protected Integer connectionTimeOut = new Integer("${CONNECTION.TIME.OUT}");

确实会带来错误。

尝试在bean中配置PropertyPlaceholderConfigurer,或者确保配置中的属性文件在类路径中正确加载。以下几行:

<context:property-placeholder
    ignore-unresolvable="true" 
    location="classpath:yourfile.properties" />

在这种情况下,在配置文件中会有所帮助。

答案 1 :(得分:2)

为避免因属性不可用而发生异常的此类情况,请在标记中添加默认值。如果属性不可用,则它将填充默认值

@Value( “$ {CONNECTION.TIME.OUT:10}”)

答案 2 :(得分:1)

对于@Value("${CONNECTION.TIME.OUT}"),您的错误为java.lang.NumberFormatException: For input string: "${CONNECTION.TIME.OUT}"。这意味着未处理表达式,导致Integer.parseInt("${CONNECTION.TIME.OUT}")抛出NumberFormatException

在Spring上下文中没有注册PropertyPlaceholderConfigurer bean,并且没有处理@Value注释或者没有定义属性CONNECTION.TIME.OUT

答案 3 :(得分:0)

别忘了它周围的“ $ {}”!我一直在看那些本来应该是显而易见的东西,却错过了它。