问题描述
我正在尝试使用Spring @Configuration和@ConfigurationProperties组合从config加载属性。我有一个POJO扩展了HashMap MyConfigPojo
)。在.yaml文件中,我具有相同的形状。但是,在启动应用程序时,尝试将defaultValue的字符串解析为Integer时出现错误。
@Configuration
@ConfigurationPropeties(prefix = "my-config")
public class MyConfigPojo extends HashMap<Integer,String> {
private String defaultValue;
private String getValueForIdOrDefault(int id); // this.get(id) OR ELSE defaultValue
}
在配置中,我有这个:
myConfig:
1: "my first value"
23: "my 23rd value"
defaultValue: "cheese"
哪个会导致
APPLICATION Failed TO START
Description:
Failed to bind properties under 'myPackage' to MyConfigPojo:
Property: myConfig[1]
Value: cheese
我认为那很奇怪,所以我打开了TRACE日志并发现了这个问题:
99 common frames omittedCaused by: java.lang.NumberFormatException: For input string: "defaultValue" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
解决方法
您正尝试从.yml文件读取地图,为此,您需要足够的testAll()
注释,不需要neverUseFullPath
注释(如果使用Spring Boot)。如果您使用的是弹簧框架,则还需要@Configuration。
使用以下示例:
@ConfigurationProperties
MyConfigPojo.java
@Configuration
现在,您可以在任何地方(例如,在控制器类中)将此myConfig:
map:
1: "my first value"
23: "my 23rd value"
defaultValue: "cheese"
类自动布线,并读取那些映射键和值。
package com.org;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.HashMap;
@Configuration
@ConfigurationProperties(prefix = "my-config")
public class MyConfigPojo {
private HashMap<String,String> map;
public HashMap<String,String> getMap() {
return map;
}
public void setMap(HashMap<String,String> map) {
this.map = map;
}
}
现在,您已经将键和值视为该Map的MyConfigPojo
数据类型,您将不会获得@Autowired
MyConfigPojo pojo;
。