@Value注释类型从String转换为Integer

问题描述 投票:46回答:9

我正在尝试将值的输出转换为整数:

@Value("${api.orders.pingFrequency}")
private Integer pingFrequency;

以上抛出错误

org.springframework.beans.TypeMismatchException: 
    Failed to convert value of type 'java.lang.String' to required type 'java.lang.Integer'; 
nested exception is java.lang.NumberFormatException: 
    For input string: "(java.lang.Integer)${api.orders.pingFrequency}"

我也试过@Value("(java.lang.Integer)${api.orders.pingFrequency}")

谷歌似乎没有多说这个话题。我想总是处理一个整数,而不是必须在它使用的任何地方解析这个值。

解决方法

我意识到一个解决方法可能是使用setter方法为我运行转换,但如果Spring可以做到这一点,我宁愿学习一些关于Spring的东西。

java spring casting annotations property-placeholder
9个回答
44
投票

假设您的类路径中包含一个属性文件

api.orders.pingFrequency=4

我试着在@Controller里面

@Controller
public class MyController {     
    @Value("${api.orders.pingFrequency}")
    private Integer pingFrequency;
    ...
}

我的servlet上下文包含:

<context:property-placeholder location="classpath:myprops.properties" />

它工作得很好。

因此,您的属性不是整数类型,您没有正确配置属性占位符,或者您使用了错误的属性键。

我尝试使用无效的属性值4123;运行。我得到的例外是

java.lang.NumberFormatException: For input string: "4123;"

这让我觉得你的财产的价值是

api.orders.pingFrequency=(java.lang.Integer)${api.orders.pingFrequency}

22
投票

我在互联网上寻找答案,我发现了以下内容

@Value("#{new java.text.SimpleDateFormat('${aDateFormat}').parse('${aDateStr}')}")
Date myDate;

所以在你的情况下你可以试试这个

@Value("#{new Integer('${api.orders.pingFrequency}')}")
private Integer pingFrequency;

7
投票

如果要将属性从属性文件转换为整数,我找到了2个解决方案:

给定方案:customer.properties包含customer.id = 100作为字段,并且您希望在spring配置文件中以整数形式访问它。属性customerId在Bean Customer中声明为int类型

解决方案1:

<property name="customerId" value="#{T(java.lang.Integer).parseInt('${customer.id}')}" />

在上面的行中,属性文件中的字符串值将转换为int类型。

解决方案2:使用其他扩展替代propeties。对于Ex.-如果您的属性文件名是customer.properties然后将其设为customer.details并在配置文件中使用以下代码

<property name="customerId"  	value="${customer.id}" />

7
投票

我有完全相同的情况。这是因为在Spring上下文中没有PropertySourcesPlaceholderConfigurer,它根据类中的@Value注释解析值。

包含一个属性占位符来解决问题,不需要对整数使用Spring表达式(如果使用ignore-resource-not-found="true",属性文件不一定存在):

<context:property-placeholder location="/path/to/my/app.properties"
    ignore-resource-not-found="true" />

4
投票

如果你正在使用@Configuation,那么在静态bean下面实例化。如果不是静态@Configutation很早实例化,并且负责解析@Value,@ Autowired等注释的BeanPostProcessors无法对其进行操作。请参阅here

@Bean
public static PropertySourcesPlaceholderConfigurer propertyConfigurer() {
   return new PropertySourcesPlaceholderConfigurer();
}

1
投票

我有同样的问题,我用这个解决了。请参阅此Spring MVC: @Value annotation to get int value defined in *.properties file

@Value(#{propertyfileId.propertyName})

作品


0
投票

当您有2个具有相同文件名的资源时,也会发生此问题;在类路径中配置的2个不同的jar或目录路径中说“configurations.properties”。例如:

您的流程或Web应用程序(jar,war或ear)中有“configurations.properties”。但是另一个依赖项(jar)在同一路径中具有相同的文件“configurations.properties”。然后我想Spring不知道(@ _ @?)在哪里获取属性并只发送在@Value注释中声明的属性名称。


0
投票

在我的情况下,问题是我的POST请求被发送到与GET相同的URL(使用“?.. = ..”获取参数)并且这些参数与表单参数具有相同的名称。可能Spring正在将它们合并到一个数组中,并且解析会抛出错误。


0
投票

当使用@Value时,你应该在Class上添加@PropertySource注释,或者在spring的xml文件中指定属性holder。例如。

@Component
@PropertySource("classpath:config.properties")
public class BusinessClass{
   @Value("${user.name}")
   private String name;
   @Value("${user.age}")
   private int age;
   @Value("${user.registed:false}")
   private boolean registed;
}

config.properties

user.name=test
user.age=20
user.registed=true

这个有效!

当然,您可以使用占位符xml配置而不是注释。 spring.xml

<context:property-placeholder location="classpath:config.properties"/>
© www.soinside.com 2019 - 2024. All rights reserved.