@Value->无法将类型“ java.lang.String”的值转换为所需的类型“ java.lang.Integer”
问题内容:
美好的一天,我正在使用Spring 4.1.1.RELEASE开发Web应用程序。所有Spring配置都是通过注释完成的,除了以下几点之外,它可以正常工作:
- 我在项目中有这些行的config.properties文件
cases.caseList.filter=test
cases.caseList.numberOfCasesPerPage=50
- 我有一个配置类
@Configuration
@ComponentScan(basePackageClasses={CaseConfig.class})
@PropertySource(value = "classpath:config.properties")
public class CasesModuleTestContextConfig { ... }
- 还有另一堂课
@Component
public class HttpRequestParamsToPaginationParams extends AbstractConverter<Map<String, String>, PaginationParams> {
@Value("${cases.caseList.filter}")
private String filter;
@Value("${cases.caseList.numberOfCasesPerPage}")
private Integer count;
...
}
已成功从属性资源注入属性“过滤器”的值。但是我在属性“ count”上遇到了一个例外:
13:58:45.274 [main] WARN o.s.c.s.GenericApplicationContext - Exception encountered during context initialization - cancelling refresh attempt
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cz.pokus.core.test.config.ConversionServiceTestConfig': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private java.util.List cz.pokus.core.test.config.ConversionServiceTestConfig.converterList; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'httpRequestParamsToPaginationParams': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private java.lang.Integer cz.pokus.core.cases.converter.HttpRequestParamsToPaginationParams.count; nested exception is 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: "${cases.caseList.numberOfCasesPerPage}"
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) ~[spring-beans-4.1.1.RELEASE.jar:4.1.1.RELEASE]
...
Caused by: 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: "${cases.caseList.numberOfCasesPerPage}"
...
Caused by: java.lang.NumberFormatException: For input string: "${cases.caseList.numberOfCasesPerPage}"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) ~[na:1.8.0_20]
at java.lang.Integer.parseInt(Integer.java:569) ~[na:1.8.0_20]
at java.lang.Integer.valueOf(Integer.java:766) ~[na:1.8.0_20]
...
当我将属性’count’的类型更改为String时,它开始工作:
@Value("${cases.caseList.numberOfCasesPerPage}")
private String count;
我相信当使用@Value将值从属性资源注入到Integer属性中时,Spring能够将String转换为Integer。我找到了一些人们在抱怨的情况下使用的示例。您是否有任何想法为什么对我不起作用?
非常感谢。
问题答案:
如果尝试使用@Value("")
注释访问属性值,则应声明PropertySourcesPlaceholderConfigurer
Bean。
尝试在配置类中添加以下代码段。
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
如果不想声明它,请尝试在org.springframework.core.env.Environment
类中自动装配它,以获取属性值。
@Autowired
private Environment environment;
public void readValues() {
System.out.println("Some Message:"
+ environment.getProperty("<Property Name>"));
}