如何强制弹簧只有一个活动配置文件?

Posted

技术标签:

【中文标题】如何强制弹簧只有一个活动配置文件?【英文标题】:How to force spring to have exactly one active profile? 【发布时间】:2021-10-03 08:15:11 【问题描述】:

我正在尝试在我的 SpringBoot 应用程序上激活一个,恰好一个配置文件。我曾经覆盖configureProfiles 方法,因此如果有多个配置文件处于活动状态,则应用程序不会运行。如果没有配置文件处于活动状态,我添加了一个默认配置文件。我想要激活的配置文件必须使用SPRING_PROFILES_ACTIVE 环境变量来定义。

在 SpringBoot 的最新版本 (2.5.x) 中,configureProfiles 是空的,并且在调用时,使用 SPRING_PROFILES_ACTIVE 定义的活动配置文件甚至不会加载。

知道如何在 SpringBoot 上拥有一个(不多也不少)活动的配置文件?

【问题讨论】:

【参考方案1】:

SPRING_PROFILES_ACTIVE 环境变量将实际设置活动配置文件。

如果您想获得活动配置文件,只需将 Environment 添加到您的 @SpringBootApplication 类并引发任何类型的 Exception 或在设置了多个配置文件的情况下关闭应用程序。

请看下面一个简单的实现。

import javax.annotation.PostConstruct;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.core.env.Environment;

@SpringBootApplication
public class SpringDemoApplication 

    private Environment environment;

    public static void main(String[] args) 
        SpringApplication.run(SpringDemoApplication.class, args);
    

    public SpringDemoApplication(Environment environment) 
        this.environment = environment;
    

    @PostConstruct
    private void post() 
        if (!this.isThereJustOneActiveProfile()) 
            throw new RuntimeException("You must set just one profile.");
        
    

    private boolean isThereJustOneActiveProfile() 
        return (this.environment.getActiveProfiles().length == 1);
    

【讨论】:

你也可以使用@Autowired注入环境,不需要setter。【参考方案2】:

您是否尝试过设置活动配置文件?

private ConfigurableEnvironment env;
...
env.setActiveProfiles(SPRING_PROFILES_ACTIVE);

有很多方法可以设置您的个人资料。

您可以查看:this Spring profiles tutorial

或者这个post

【讨论】:

以上是关于如何强制弹簧只有一个活动配置文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何从环境变量中添加活动弹簧配置文件?

当特定的弹簧配置文件处于活动状态时,如何防止运行测试?

使用 bootWar 设置活动弹簧配置文件

覆盖多个弹簧活动配置文件的属性值

在 docker 中使用 gradle 设置活动弹簧配置文件没有任何效果

如何在某个弹簧配置文件中禁用飞路?