编程语言
首页 > 编程语言> > java – 加载多个YAML文件(使用@ConfigurationProperties?)

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

作者:互联网

使用Spring Boot 1.3.0.RELEASE

我有几个yaml文件描述了程序的几个实例.我现在想要将所有这些文件解析为List< Program> (Map,无论如何),所以我稍后可以在所有程序中搜索给定条件的最合适的实例.

我非常喜欢使用@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 Boot中最好的方法是在classpath目录中加载一堆yaml文件并将它们解析为(List of)POJO,这样它们可以在Controller中自动装配?我是否需要直接使用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);
    }

解决方法:

就我理解你的问题而言,我目前正在做的事情几乎是一样的.
我有一个application.yml以及特定于配置文件的yml文件,例如我的src / main / resources中的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-Boot配置中,您必须在配置类中添加以下注释:

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

     @Autowired
     private AppSettings appSettings;

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

@Autowiring也可以从其他豆子访问.
反过来(没有额外的分隔和类型安全的类,是通过@Value(“${name}”)访问YML值.

以简短的方式将它们结合在一起:
是的,可以通过Spring-profiles为您的应用程序使用多个YAML文件.您可以通过命令args,以编程方式或通过系统env(SPRING_PROFILES_ACTIVE = name1,name2)定义当前的活动弹簧配置文件.
因此,每个配置文件可以有几个application.yml文件(参见上文).

标签:snakeyaml,java,spring,spring-boot
来源: https://codeday.me/bug/20190727/1556776.html