Java 加载多个YAML文件(使用@ConfigurationProperties?)
使用Spring Boot 1.3.0.0版本 我有两个yaml文件,它们描述了一个程序的几个实例。现在我想将所有这些文件解析成一个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
列表
(映射,无论什么),以便稍后在所有程序中搜索给定条件的最合适实例
我非常喜欢使用@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());
}
}