2017-05-12 5 views
1

実行時にSpringコンフィグレーションサーバでいくつかのプロパティを追加したいのですが、すべてのクライアントアプリケーションで@Valueアノテーションを使用できるようにする必要があります。実行時にSpringコンフィグレーションサーバプロパティを追加する

私はこの値をスプリング設定サーバーで計算して環境に追加する予定なので、このプロパティはあらかじめ定義されていません。

これを達成するための最良の方法を理解していただけますか。

+0

この回答を見るhttp://stackoverflow.com/questions/37873433/spring-cloud-config-server-rabbitmq/37873783#37873783 –

+0

[Spring Cloud Config Server + RabbitMQ]の可能な複製(http:// stackoverflow .com/questions/37873433/spring-cloud-config-server-rabbitmq) – Raz0rwire

+1

いいえ別の質問 –

答えて

2

Springクラウド設定には、実行中のアプリケーションのプロパティとBeanをリフレッシュできる「RefreshScope」という名前の機能が含まれています。

春のクラウド設定について読んだ場合、gitリポジトリからのみプロパティをロードできるように見えますが、それは当てはまりません。

RefreshScopeを使用すると、外部のgitリポジトリまたはHTTPリクエストに接続する必要なく、ローカルファイルからプロパティをリロードすることができます。

このコンテンツをファイルbootstrap.propertiesを作成します。

# false: spring cloud config will not try to connect to a git repository 
spring.cloud.config.enabled=false 
# let the location point to the file with the reloadable properties 
reloadable-properties.location=file:/config/defaults/reloadable.properties 

は、あなたが上で定義された場所にファイル reloadable.propertiesを作成します。 空のままにすることも、いくつかのプロパティを追加することもできます。このファイルでは、後で実行時にプロパティを変更または追加できます。

実行時に変更することができる性質を、使用しているすべてのBeanは、このような@RefreshScopeで注釈付けされなければならない

<dependency> 
    <groupId>org.springframework.cloud</groupId> 
    <artifactId>spring-cloud-starter-config</artifactId> 
</dependency> 

に依存関係を追加します。

@Bean 
@RefreshScope 
Controller controller() { 
    return new Controller(); 
} 

は、クラス

を作成します。
public class ReloadablePropertySourceLocator implements PropertySourceLocator 
{ 
     private final String location; 

     public ReloadablePropertySourceLocator(
      @Value("${reloadable-properties.location}") String location) { 
      this.location = location; 
     } 

    /** 
    * must create a new instance of the property source on every call 
    */ 
    @Override 
    public PropertySource<?> locate(Environment environment) { 
     try { 
      return new ResourcePropertySource(location); 
     } catch (IOException e) { 
      throw new RuntimeException(e); 
     } 
    } 
} 

そのクラスを使用してSpringにbootstrap the configurationを設定する。

あなたのリソースフォルダにMETA-INF/spring.factoriesファイルを作成します(または拡張):

org.springframework.cloud.bootstrap.BootstrapConfiguration=your.package.ReloadablePropertySourceLocator 

このBeanはreloadable.propertiesからプロパティを読み込みます。 Spring Cloud Configは、アプリケーションをリフレッシュするときにディスクからリロードします。

ランタイムを追加して、好きなようにreloadable.propertiesを編集し、次にスプリングコンテキストを更新します。 あなたは/refreshエンドポイントにPOSTリクエストを送信することにより、またはJavaでContextRefresherを使用していることを行うことができます。

@Autowired 
ContextRefresher contextRefresher; 
... 
contextRefresher.refresh(); 

リモートgitリポジトリからプロパティと並行して、それを使用することを選択した場合、これは、また、動作するはずです。

+0

お返事ありがとうございました。外部化されたファイルにランタイムプロパティを追加でき、バネ設定サーバーが自動的にロードすることを提案していると思います。しかし、私はファイルに書き込むことなく達成することが可能ですか? environment.addPorperty(key、Value)のようなやり方で、すべての設定クライアントに利用できますか? –

+0

@RefreshScopeでBeanを定義するのではなく、プロジェクトに対してグローバルに行うことはできますか –

関連する問題