【问题标题】:Spring Boot run hierarchical profiles configurationSpring Boot 运行分层配置文件配置
【发布时间】:2022-01-04 11:07:37
【问题描述】:

我有以下 Spring 项目结构(我无法更改):

project/
    config/
        us/
            dev.yml
            stg.yml
        dev.yml
        stg.yml
    src/
        main/
            java/
            resources/
                application.yml

我想运行以下分层分析:application.yml,然后用dev.yml 覆盖,然后再次用us/dev.yml 覆盖。我不知道如何成功地执行此操作

【问题讨论】:

    标签: spring-boot yaml


    【解决方案1】:

    您可以创建一个ApplicationContextInitializer 来使用YamlPropertySourceLoader 读取这些文件。然后,它可以使用ConfigurableApplicationContext.getEnvironment().getPropertySources().addFirst():以所需的顺序将它们设置为属性源:

    
    public class YamlFileApplicationContextInitializer
            implements ApplicationContextInitializer<ConfigurableApplicationContext> {
    
        @Override
        public void initialize(ConfigurableApplicationContext ctx) {
            try {
                YamlPropertySourceLoader sourceLoader = new YamlPropertySourceLoader();
    
                Resource usDev = ctx.getResource("project/config/us/dev.yml");
                sourceLoader.load("us_dev", usDev).forEach(propertySource
                        -> ctx.getEnvironment().getPropertySources().addFirst(propertySource));
    
                Resource dev = ctx.getResource("project/config/dev.yml");
                sourceLoader.load("dev", dev).forEach(propertySource ->
                        ctx.getEnvironment().getPropertySources().addFirst(propertySource));
    
            }
            catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
    

    您可以将此初始化程序添加到您的应用程序类中,如下所示:

    SpringApplication app = new SpringApplication(MyApplication.class);
    app.addInitializers(new YamlFileApplicationContextInitializer());
    app.run();
    

    如果您需要基于某些启用的 Spring 配置文件包含这些文件,您可以参考属性ctx.getEnvironment().getActiveProfiles() 并有条件地添加这些文件。

    【讨论】:

    • 有没有不涉及任何编码的解决方案?
    • 我不知道。 Spring Boot 有一些关于如何命名配置文件以及它们应该位于何处的约定。如果您无法更改配置结构的任何内容,则需要编写一些扩展。
    猜你喜欢
    • 2020-05-07
    • 2019-03-14
    • 1970-01-01
    • 2019-07-12
    • 1970-01-01
    • 2017-12-21
    • 2019-12-15
    • 2020-01-14
    • 1970-01-01
    相关资源
    最近更新 更多