Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.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
Java 加载多个YAML文件(使用@ConfigurationProperties?)_Java_Spring_Spring Boot_Snakeyaml - Fatal编程技术网

Java 加载多个YAML文件(使用@ConfigurationProperties?)

Java 加载多个YAML文件(使用@ConfigurationProperties?),java,spring,spring-boot,snakeyaml,Java,Spring,Spring Boot,Snakeyaml,使用Spring Boot 1.3.0.0版本 我有两个yaml文件,它们描述了一个程序的几个实例。现在我想将所有这些文件解析成一个列表(映射,无论什么),以便稍后在所有程序中搜索给定条件的最合适实例 我非常喜欢使用@ConfigurationProperties的方法,它对于单个yaml文件来说已经足够好了,但是我还没有找到一种使用该方法读取目录中所有文件的方法 适用于单个文件的当前方法: programs/program1.yml name: Program 1 minDays: 4 ma

使用Spring Boot 1.3.0.0版本

我有两个yaml文件,它们描述了一个程序的几个实例。现在我想将所有这些文件解析成一个
列表
(映射,无论什么),以便稍后在所有程序中搜索给定条件的最合适实例

我非常喜欢使用
@ConfigurationProperties
的方法,它对于单个yaml文件来说已经足够好了,但是我还没有找到一种使用该方法读取目录中所有文件的方法

适用于单个文件的当前方法:

programs/program1.yml

name: Program 1
minDays: 4
maxDays: 6
可以阅读

@Configuration
@ConfigurationProperties(locations = "classpath:programs/program1.yml", ignoreUnknownFields = false)
public class ProgramProperties {

private Program test; //Program is a POJO with all the fields in the yml.
//getters+setters
我尝试将位置更改为一个数组,列出我的所有文件
位置={“classpath:programs/program1.yml”,“classpath:programs/program2.yml”}
以及使用
locations=“classpath:programs/*.yml”
,但仍然只加载第一个文件(数组方法),或者根本不加载(通配符方法)

所以,我的问题是,在Spring引导中,最好的方法是什么,在类路径目录中加载一堆yaml文件,并将它们解析为POJO(列表),这样它们就可以在控制器中自动连接?我是否需要直接使用Snakeyaml,还是有一个我还没有找到的集成机制

编辑: 工作方法是手动执行:

    private static final Yaml yaml = new Yaml(new Constructor(Program.class));
private static final ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();

try {
        for (Resource resource : resolver.getResources("/programs/*.yml")) {

            Object data = yaml.load(resource.getInputStream());

            programList.add((Program) data);
        }
    }
    catch (IOException ioe) {
        logger.error("failed to load resource", ioe);
    }

在Spring中,可以使用
PropertySource
注释加载多个配置属性文件,但不能加载YAML文件。见以下链接中的第26.6.4节:

然而,从您的问题来看,您似乎可以在单个YAML中配置所有程序,然后在单个列表中获取所有程序列表

样本YAML(全部YAML)

Config.java

@Configuration
@ConfigurationProperties(locations={"classpath:all.yaml"})
public class Config{

    private List<Program> programs;

    public void setPrograms(List<Program> programs) {
        this.programs = programs;
    }

    public List<Program> getPrograms() {
        return programs;
    }
}
@配置
@ConfigurationProperties(位置={“classpath:all.yaml”})
公共类配置{
私人名单方案;
公共程序(列表程序){
这个程序=程序;
}
公共列表getPrograms(){
返回程序;
}
}

据我所知,你的问题与我目前所做的几乎相同。 我在我的
src/main/resources
中有一个
application.yml
和一个配置文件特定的yml文件,例如
application-{profile}.yml
。 在
application.yml
中,我定义了默认的配置文件键值,这些键值部分被配置文件特定的yml文件覆盖

如果希望对YML键/值进行类型安全且定义良好的访问,则可以使用以下方法:

 @ConfigurationProperties
 public class AppSettings {
     String name; // has to be the same as the key in your yml file

     // setters/getters

 }
在Spring引导配置中,必须在配置类中添加以下注释:

@ComponentScan
@EnableAutoConfiguration
@EnableConfigurationProperties( value = { AppSettings.class, SomeOtherSettings.class } )
public class SpringContextConfig {

     @Autowired
     private AppSettings appSettings;

     public void test() {
          System.out.println(appSettings.getName());
     }
}
@Autowiring
也可以从其他bean访问。 另一种方法(没有额外的分隔和类型安全类)是通过
@Value(${name}”)
访问YML值

以简短的方式将其组合在一起: 是的,可以通过Spring配置文件为您的应用程序使用多个YAML文件。您可以通过命令args以编程方式或通过系统环境(Spring\u profiles\u active=name1,name2)定义当前活动的Spring配置文件。
因此,您可以为每个配置文件拥有多个
application.yml
文件(见上文).

通配符很快就不起作用,但是使用数组应该可以,但是您似乎忘记了其中的
类路径:
前缀。感谢您的输入,我编辑了上面的文本,就像我在尝试时在代码中所做的那样。但是,如果这种方法可行,我将如何编写我的类(或更改yaml结构?)这个程序不只是填充了第一个yaml文件的数据,而是成为了所有不同程序的列表?感谢mohit,这肯定是有效的,也是我的第一个方法,但我想走单独的文件路线,因为单个程序可能会变得相当大,并产生“all.yaml”在这种情况下,您可以在方法上使用@ConfigurationProperties注释,然后通过编写您自己的代码来加载配置。这种方法更多地是您所讨论的方法,具有自动连接列表的额外优势。仅供参考:
@配置中的
位置
参数属性
在第1.4节中被降价为“有利于使用其他位置直接配置环境”。我不认为这是关于如何命名不同的profile application.yml文件的问题。
@ComponentScan
@EnableAutoConfiguration
@EnableConfigurationProperties( value = { AppSettings.class, SomeOtherSettings.class } )
public class SpringContextConfig {

     @Autowired
     private AppSettings appSettings;

     public void test() {
          System.out.println(appSettings.getName());
     }
}