Spring @Value类型不匹配异常:将值从类型“java.lang.String”转换为所需类型“java.lang.Double”失败。

43

我想使用@Value注释来注入一个Double属性,例如:

@Service
public class MyService {

    @Value("${item.priceFactor}")
    private Double priceFactor = 0.1;

// ...

使用Spring属性占位符(属性文件):

item.priceFactor=0.1

我收到异常:

org.springframework.beans.TypeMismatchException: 无法将类型为 'java.lang.String' 的值转换为必需的类型 'java.lang.Double'; 嵌套异常是 java.lang.NumberFormatException:对于字符串输入:“${item.priceFactor}”

有没有一种方法可以使用来自属性文件的Double值?


double 能用吗? - Ami Hollander
@AmiHollander,它甚至不能处理原始类型double。 - guilhebl
6个回答

84

尝试更改以下行

@Value("${item.priceFactor}")

@Value("#{new Double('${item.priceFactor}')}")

12
一百万的价格答案,非常罕见,在许多地方都不可得。 - ArifMustafa
1
在Spring Boot 1.5.9上运行得非常好。 - realPK

7
这应该可以解决问题-
@Value("#{T(Double).parseDouble('${item.priceFactor}')}")
private Double priceFactor;

int是原始类型。尝试使用对象Integer。 - Joe
我能够使用一个原始的Long使这个工作正常,我认为这应该是被接受的答案的一部分,因为在这里添加T(Double)而不是Double是真正的难点,很难直观地发现。感谢您的回答。 - alegria

1
我遇到了类似的问题,但是出现的不是 required type 'java.lang.Double',而是 required type 'java.lang.Long'。我正在使用来自 YAML 文件的 env. 变量。结果发现 YAML 不支持 Long 数据类型。

1
以下逻辑对我而言可以不使用 new Double 而正常工作:
@Value("${item.priceFactor}")
private Double priceFactor;

item.priceFactor=0.1

Spring会自动为您转换。


0

你忘记了使用@PropertySource注解,并将属性文件的名称作为参数。

它应该在@Service注解之前或之后出现。

请查看一个使用@Configuration(@Service的超类型)的工作解决方案,链接为https://github.com/bojanantonovic/spring-properties-demo


-2
如何存储字符串并通过getter和setter将其转换为数字,例如整数和双精度浮点数?对于使用Java注入的安全代码,您应该始终使用getter和setter,并且在任何情况下都只能使用其他方法。我强烈建议您阅读有关Java安全性的文章(这不是针对黑客的),而是针对代码的使用和编写,就像您上传的那个使用注入的代码一样。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接