在 Spring 引导应用程序中修改活动配置文件并刷新 ApplicationContext 运行时
Modify active profiles and refresh ApplicationContext runtime in a Spring Boot application
我有一个 Spring 引导 Web 应用程序。使用 @Configurable 注释通过 java 类 配置应用程序。我介绍了两个配置文件:'install'、'normal'。
如果安装配置文件处于活动状态,则加载 none 个需要数据库连接的 Bean。
我想创建一个控制器,用户可以在其中设置数据库连接参数,完成后我想将活动配置文件从 'install' 切换到 'normal' 并刷新应用程序上下文,因此 Spring 可以初始化每一个需要DB数据源的bean。
我可以通过代码修改活动配置文件列表,没有问题,但是当我尝试刷新应用程序上下文时,我得到以下 异常:
`java.lang.IllegalStateException:
GenericApplicationContext does not support multiple refresh attempts: just call 'refresh' once`
这就是我启动 Spring 启动应用程序的方式:
`new SpringApplicationBuilder().sources(MyApp.class)
.profiles("my-profile").build().run(args);`
有人知道如何启动 spring 引导应用程序,让您多次刷新应用程序上下文吗?
您不能只刷新现有上下文。您必须关闭旧的并创建一个新的。您可以在 Spring 云中看到我们如何做到这一点: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;
}
我有一个 Spring 引导 Web 应用程序。使用 @Configurable 注释通过 java 类 配置应用程序。我介绍了两个配置文件:'install'、'normal'。 如果安装配置文件处于活动状态,则加载 none 个需要数据库连接的 Bean。 我想创建一个控制器,用户可以在其中设置数据库连接参数,完成后我想将活动配置文件从 'install' 切换到 'normal' 并刷新应用程序上下文,因此 Spring 可以初始化每一个需要DB数据源的bean。
我可以通过代码修改活动配置文件列表,没有问题,但是当我尝试刷新应用程序上下文时,我得到以下 异常:
`java.lang.IllegalStateException:
GenericApplicationContext does not support multiple refresh attempts: just call 'refresh' once`
这就是我启动 Spring 启动应用程序的方式:
`new SpringApplicationBuilder().sources(MyApp.class)
.profiles("my-profile").build().run(args);`
有人知道如何启动 spring 引导应用程序,让您多次刷新应用程序上下文吗?
您不能只刷新现有上下文。您必须关闭旧的并创建一个新的。您可以在 Spring 云中看到我们如何做到这一点: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;
}