2017-11-15 7 views
3

私はJavaとSpringのブートアプリケーションを扱っています。実行時にドッカーイメージの環境変数として追加する必要があるプロパティファイルがあります。以下のようにプレースホルダを介して使用されるとき、プロパティのいくつかは既存の環境を通してフィルタリングされます。簡単なJavaプログラムでスプリングプロパティプレースホルダを置き換える方法

app.name=MyApp 
app.description=${app.name} is a Spring Boot application 

このプロパティファイルを読み込んでフィルタリングされたプロパティを持つマップオブジェクトを作成するためのサンプルJavaファイルを作成しています。このプロセスでは、どのようにプレースホルダを実際のプロパティ値に置き換えることができますか?

私はgetPropertyメソッドを使用してキーを探して交換しようとしました。しかし、メンテナンスの難しさを避けるために、ハードコードされたプロパティキー名を調べないようにしたいと思います。 ありがとうございます。

答えて

2

を記述する必要があります、私はプロパティ値を取得する方法と、新しいProperties子孫を作成します、もしあれば、すべての参照を置き換えます。このような

何か:

class MyProperties extends Properties 
{ 
    // Constructors, as needed 
    private Pettern p = Pattern.compile("\\$\\{([^}]+)\\}"); 
    public String getString(final String key) 
    { 
     final String value = getProperty(key); 
     if (null == value) 
      return null; 
     final StringBuffer result = new StringBuffer(); 
     final Matcher m = p.matcher(value); 
     while (m.find()) 
     { 
      final String refKey = m.group(1); 
      final String refValue = getProperty(refKey); 
      m.appendReplacement(result, null == refValue ? refKey : refValue); 
     } 
     m.appendTail(result); 
     return result.toString(); 
    } 
} 
+0

完璧に動作します...ありがとうございます 2行目に誤植を指摘します プライベートパターンp = Pattern.compile( "\\ $ \\ { ([^}] +)\\} "); – Sathya

2

番号付きトークンを番号付きトークンに置き換え、MessageFormat Java SEクラスを使用します。それはあなたが求めるものを正確に行うことを可能にします。

あなたのファイルからロードされたすべてのプロパティがpropsに含まれていると仮定します。

MessageFormat.format((String) props.get("app.description"),((String) props.get("app.name")); 

ここにあなたの財産をしなければならない。そうでなければ

app.description={0} is a Spring Boot application

カスタム

+0

このコードセグメントは、プレースホルダ値を置き換えるものではありません。それは$ {1} – Sathya

+0

@Sathyaと同じままです[ここ](https://ideone.com/yEeXHn)のコードを参照してください。最初は間違ったプレースホルダを追加しました。編集しました –

+0

この回答は「ハードコードされたプロパティキー名」については役に立ちません。 –

関連する問題