Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在spring boot中从多个YAML文件读取值_Spring_Spring Boot_Yaml - Fatal编程技术网

在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
并覆盖一些方法,如 setLocation以满足使用regex文件名模式读取多个文件的特定需要。此外,您还可以使用环境变量作为属性文件的名称。