在spring boot中从多个YAML文件读取值
在spring boot中从多个YAML文件读取值,spring,spring-boot,yaml,Spring,Spring Boot,Yaml,spring.config.location可以接受一个目录列表,其中包含spring引导应用程序的yaml文件 但是列出的目录必须有名为application.yml的文件,否则将无法获取它们 如果我的应用程序允许用户使用任何名称放置yaml文件,则我不能使用此选项 然后我手动将文件名添加到属性中,如下所示 spring.config.location=/location1/file1.yml,/location2/file2.yml 每次添加新文件时,我都必须修改此属性 我能够使用YamlP
spring.config.location
可以接受一个目录列表,其中包含spring引导应用程序的yaml文件
但是列出的目录必须有名为application.yml
的文件,否则将无法获取它们
如果我的应用程序允许用户使用任何名称放置yaml文件,则我不能使用此选项
然后我手动将文件名添加到属性中,如下所示
spring.config.location=/location1/file1.yml,/location2/file2.yml
每次添加新文件时,我都必须修改此属性
我能够使用YamlPropertySourceLoader
读取所有文件,并将所有属性放入地图
,但是有没有另一种更优雅的方法可以让我将这些值直接绑定到@Value
注释中
使用我当前使用的代码段进行更新,但寻找其他更好的替代方案
Resource[] resources = applicationContext.getResources("classpath*:*.properties");
Map<Object, Object> map = new HashMap<>();
Arrays.stream(resources).forEach(res -> {
try {
propertiesPropertySourceLoader.load("resources", res)
.forEach(prop -> map.putAll((Map<?, ?>) prop.getSource()));
} catch (IOException e) {
e.printStackTrace();
}
});
Resource[]resources=applicationContext.getResources(“classpath*:*.properties”);
Map Map=newhashmap();
Arrays.stream(resources).forEach(res->{
试一试{
propertiesPropertySourceLoader.load(“资源”,res)
.forEach(prop->map.putAll((map)prop.getSource());
}捕获(IOE异常){
e、 printStackTrace();
}
});
如果应用程序中有多个yml/properties文件,则可以在配置类上使用@PropertySource(“classpath:file.properties”)
,从而可以从该配置文件中读取值
如果应用程序中有多个yml/properties文件,则可以在配置类上使用
@PropertySource(“classpath:file.properties”)
,从而可以从该配置文件中读取值
您可以使用
PropertyPlaceHolderConfigure
配置多个配置文件,例如:
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>${YOUR_HOME}/global.properties</value>
<value>${YOUR_HOME}/second-level.properties</value>
</list>
</property>
<property name="ignoreUnresolvablePlaceholders" value="true"/>
<property name="fileEncoding" value="UTF8"/>
@PropertySource(value = {"classpath:global.properties", "file://${YOUR_HOME}/second-level.properties"}, ignoreResourceNotFound = true)
您可以使用
PropertyPlaceHolderConfigure
配置多个配置文件,例如:
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>${YOUR_HOME}/global.properties</value>
<value>${YOUR_HOME}/second-level.properties</value>
</list>
</property>
<property name="ignoreUnresolvablePlaceholders" value="true"/>
<property name="fileEncoding" value="UTF8"/>
@PropertySource(value = {"classpath:global.properties", "file://${YOUR_HOME}/second-level.properties"}, ignoreResourceNotFound = true)
如果可能,请提供您的方法我使用正则表达式读取我的类路径上与*yaml模式匹配的所有文件,我将这些资源提供给YamlPropertySourceLoader,该资源可用于将所有属性作为映射加载。代码片段将有助于更新,请看一看Abhinav。如果可能,请提供您的方法。我使用正则表达式读取我的类路径上与*yaml模式匹配的所有文件,我将这些资源提供给YamlPropertySourceLoader,该资源可用于将所有属性作为映射加载。代码片段将有助于更新,请看一看Abhinav。这需要我对文件名进行硬编码,我的情况是,文件名可以是任何名称,我不想每次添加新的prop/yml文件时都更改代码。您可以使用占位符允许您在运行时动态选择正确的文件…检查我的链接shared@PropertySource({“类路径:*.yml”})由于此原因,应用程序无法启动。这需要我对文件名进行硬编码,我的情况是文件名可以是任何名称,我不想每次添加新的prop/yml文件时都更改代码。您可以使用占位符在运行时动态选择正确的文件…检查我的链接shared@PropertySource({“classpath:.yml”})由于此原因,应用程序无法启动。感谢您的响应,但我尝试不硬编码文件名。但是匹配所有yaml或属性文件的正则表达式应该可以。您可以扩展
PropertyPlaceHolderConfigure
并覆盖一些方法,如setLocation
,以满足读取多个文件的特定需要使用文件名的正则表达式模式。此外,您可以使用环境变量作为属性文件的名称。感谢您的响应,但我尝试不硬编码文件名。但是匹配所有yaml或属性文件的正则表达式应该可以。您可以扩展PropertyPlaceHolderConfigure
并覆盖一些方法,如