9

Spring ブート Web アプリケーションがあります。アプリケーションは、 @Configurableアノテーションを使用して Java クラスを介して構成されます。「インストール」、「通常」の 2 つのプロファイルを導入しました。インストール プロファイルがアクティブな場合、DB 接続を必要とする Bean はロードされません。ユーザーがデータベース接続パラメーターを設定できるコントローラーを作成したいのですが、それが完了したら、アクティブなプロファイルを「インストール」から「通常」に切り替え、アプリケーションコンテキストを更新して、Spring が必要なすべての Bean を初期化できるようにしますDB データ ソース。

コードからアクティブなプロファイルのリストを問題なく変更できますが、アプリケーション コンテキストを更新しようとすると、次の例外が発生します。

`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);` 

アプリのコンテキストを複数回更新できるスプリングブートアプリを開始する方法を知っている人はいますか?

4

1 に答える 1

13

既存のコンテキストを単に更新することはできません。古いものを閉じて、新しいものを作成する必要があります。ここで、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;
}
于 2015-02-17T17:48:25.727 に答える