我正在尝试将值的输出转换为整数:
@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的东西。
假设您的类路径中包含一个属性文件
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}
我在互联网上寻找答案,我发现了以下内容
@Value("#{new java.text.SimpleDateFormat('${aDateFormat}').parse('${aDateStr}')}")
Date myDate;
所以在你的情况下你可以试试这个
@Value("#{new Integer('${api.orders.pingFrequency}')}")
private Integer pingFrequency;
如果要将属性从属性文件转换为整数,我找到了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}" />
我有完全相同的情况。这是因为在Spring上下文中没有PropertySourcesPlaceholderConfigurer,它根据类中的@Value
注释解析值。
包含一个属性占位符来解决问题,不需要对整数使用Spring表达式(如果使用ignore-resource-not-found="true"
,属性文件不一定存在):
<context:property-placeholder location="/path/to/my/app.properties"
ignore-resource-not-found="true" />
如果你正在使用@Configuation,那么在静态bean下面实例化。如果不是静态@Configutation很早实例化,并且负责解析@Value,@ Autowired等注释的BeanPostProcessors无法对其进行操作。请参阅here
@Bean
public static PropertySourcesPlaceholderConfigurer propertyConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
我有同样的问题,我用这个解决了。请参阅此Spring MVC: @Value annotation to get int value defined in *.properties file
@Value(#{propertyfileId.propertyName})
作品
当您有2个具有相同文件名的资源时,也会发生此问题;在类路径中配置的2个不同的jar或目录路径中说“configurations.properties”。例如:
您的流程或Web应用程序(jar,war或ear)中有“configurations.properties”。但是另一个依赖项(jar)在同一路径中具有相同的文件“configurations.properties”。然后我想Spring不知道(@ _ @?)在哪里获取属性并只发送在@Value注释中声明的属性名称。
在我的情况下,问题是我的POST请求被发送到与GET相同的URL(使用“?.. = ..”获取参数)并且这些参数与表单参数具有相同的名称。可能Spring正在将它们合并到一个数组中,并且解析会抛出错误。
当使用@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"/>