9

我有一个 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 应用程序吗?

4

1 回答 1

13

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

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

@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;
}
于 2015-02-17T17:48:25.727 回答