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

10

我有一个基于Spring Boot的Web应用程序。该应用程序通过使用@Configurable注释的Java类进行配置。我引入了两个配置文件:“install”和“normal”。 如果激活的是安装配置文件,则不会加载需要数据库连接的任何Bean。 我想创建一个控制器,让用户设置数据库连接参数,设置完成后我想将活动配置文件从“install”更改为“normal”,并刷新应用程序上下文,以便Spring可以初始化需要DB数据源的每个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个回答

14

您不能仅刷新现有的上下文,您必须关闭旧的上下文并创建一个新的上下文。您可以在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,或者您可以复制该代码并将其用于自己的 "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;
}

很不幸,链接已经失效了。您能否在这里包含基本代码? - DB5
1
@DaveSyer 先生,这个也可以不用 Springboot 来完成吗? - tryingToLearn
我不认为有什么问题。但是你需要一种方法来引导上下文(并记住其来源)。这就是代码片段中的“应用程序”所做的事情。 - Dave Syer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接