我想在springboot中用Map<String, List<String>>
在yaml文件之间映射值
country.yml
文件:
entries:
map:
MY:
- en
- zh
SampleConfig
文件:
@Configuration
@EnableConfigurationProperties
@ConfigurationProperties("entries")
public class SampleConfig {
private Map<String, List<String>> map = new HashMap<>();
@Bean
public void bean1(){
System.err.println("map has size: "+map.size());
}
}
但是map.size()
始终为0,不确定我做错了什么。
答案 0 :(得分:2)
有两个问题
1)默认情况下,spring会在默认位置查找application.yml
或application.properties
要解决上述问题,您可以使用application.yml
代替country.yml
2)您可以使用@PropertySource
加载任何外部属性文件,但此注释不支持yml
24.7.4 YAML Shortcomings您不能对@PropertySource
文件使用yml
无法使用@PropertySource批注来加载YAML文件。因此,在需要以这种方式加载值的情况下,需要使用属性文件。
答案 1 :(得分:2)
这将起作用并打印出CountryData : {MY=[en, zh]}
,但请务必阅读Deadpool的答案。
hack 在此处用“国家/地区”覆盖默认配置名称“应用程序”
在示例中,我是通过System属性进行设置的,但是通过
java -jar mycountryapp.jar --spring.config.name=country
应该工作正常
@SpringBootApplication
public class Application {
static {
System.setProperty("spring.config.name", "country");
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@Service
class CountryService {
private final CountryData countryData;
public CountryService(CountryData countryData) {
this.countryData = countryData;
}
@EventListener(ApplicationReadyEvent.class)
public void showCountryDataOnStartup() {
System.err.println("CountryData : " + countryData.getMap());
}
}
@Configuration
@ConfigurationProperties(prefix = "entries")
class CountryData {
Map<String, List<String>> map;
public Map<String, List<String>> getMap() {
return map;
}
public void setMap(Map<String, List<String>> map) {
this.map = map;
}
}
答案 2 :(得分:1)
假设您的应用程序正在country.yml
中选择配置(我也会检查)-您需要使用getter和setter才能使其正常工作。只需添加:
@Configuration
@EnableConfigurationProperties
@ConfigurationProperties("entries")
public class SampleConfig {
private Map<String, List<String>> map = new HashMap<>();
public Map<String, List<String>> getMap(){
return map;
}
public void setMap(Map<String, List<String>> map){
this.map=map;
}
}