在 Spring Boot 应用程序中修改活动配置文件并刷新 ApplicationContext 运行时

Posted

技术标签:

【中文标题】在 Spring Boot 应用程序中修改活动配置文件并刷新 ApplicationContext 运行时【英文标题】:Modify active profiles and refresh ApplicationContext runtime in a Spring Boot application 【发布时间】:2015-04-16 22:43:32 【问题描述】:

我有一个 Spring Boot Web 应用程序。该应用程序是通过 java 类使用 @Configurable 注释进行配置的。我介绍了两个配置文件:“安装”、“正常”。 如果安装配置文件处于活动状态,则不会加载任何需要 DB 连接的 Bean。 我想创建一个控制器,用户可以在其中设置数据库连接参数,完成后我想将活动配置文件从“安装”切换到“正常”并刷新应用程序上下文,因此 Spring 可以初始化每个需要的 bean数据库数据源。

我可以从代码修改活动配置文件列表,没有问题,但是当我尝试刷新应用程序上下文时,我得到以下异常

`java.lang.IllegalStateException:
 GenericApplicationContext does not support multiple refresh attempts: just call 'refresh' once`

这就是我启动 Spring Boot 应用程序的方式:

`new SpringApplicationBuilder().sources(MyApp.class)
.profiles("my-profile").build().run(args);` 

有人知道如何启动让您多次刷新应用上下文的 Spring Boot 应用吗?

【问题讨论】:

【参考方案1】:

您不能只刷新现有上下文。您必须关闭旧的并创建一个新的。您可以在此处查看我们如何在 Spring Cloud 中执行此操作:https://github.com/spring-cloud/spring-cloud-commons/blob/master/spring-cloud-context/src/main/java/org/springframework/cloud/context/restart/RestartEndpoint.java。如果您愿意,您可以通过添加 spring-cloud-context 作为依赖项来包含 Endpoint,或者您可以复制我猜的代码并在您自己的“端点”中使用它。

这是端点实现(字段中缺少一些细节):

@ManagedOperation
public synchronized ConfigurableApplicationContext restart() 
  if (this.context != null) 
    if (this.integrationShutdown != null) 
      this.integrationShutdown.stop(this.timeout);
    
    this.application.setEnvironment(this.context.getEnvironment());
    this.context.close();
    overrideClassLoaderForRestart();
    this.context = this.application.run(this.args);
  
  return this.context;

【讨论】:

不幸的是,链接已失效。有没有机会在这里包含基本代码? @DaveSyer 先生,如果没有Springboot 也可以这样做吗? 我不明白为什么不这样做。但是你需要一种方法来引导上下文(并记住它的来源)。这就是“应用程序”在代码 sn-p 中所做的事情。

以上是关于在 Spring Boot 应用程序中修改活动配置文件并刷新 ApplicationContext 运行时的主要内容,如果未能解决你的问题,请参考以下文章

如何根据 Spring Boot 中的活动配置文件设置注释属性值?

如何使用 Spring Boot 以编程方式确定当前的活动配置文件 [重复]

如何使用 Spring Boot 以编程方式确定当前的活动配置文件 [重复]

如何为 Spring Boot 应用程序的 gradle 构建设置活动配置文件?

使用 maven 插件设置时 Spring Boot 配置文件不活动

如何使用 Spring Boot 以编程方式确定当前的活动配置文件 [重复]