2017-03-10 14 views
0

私は動的プロパティ名を検索することによって値を設定する必要があるインスタンス変数を持っています。Spring SPELを使用して動的プロパティ名を解決するにはどうすればよいですか?

Class Test { 
    @Value("#{T(java.lang.String).format('filter.%s.disable', getClass().getSimpleName())}") 
    private boolean disable; 
} 

disableはそうtruefilter.Test.disable = truefalseに評価する必要があります。プロパティが定義されていない場合は、デフォルト値のfalseを設定することもできます。これは通常、次の構文を使用して行われますが、この場合はわかりません。 @Value("${property:default}")

私はエラーを取得しています:

Caused by: java.lang.IllegalArgumentException: Invalid boolean value [filter.BeanExpressionContext.disable]

も無駄に@Value("${'dcs.cloud.filter.'#{getClass().getSimpleName()}'.disable'}")#$の他のいくつかの組み合わせを試してみました。

SPEL docは、異なる構文を使用する表現を評価するための無用のparser.parseExpressionの呼び出しを示していますが、実際には誰もそれを行いません。実際の例ではなくユニットテストからコードを選んだようです。

答えて

0

式がそのように宣言されているクラスにアクセスすることはできません。 getClass()ここでは、式の評価のためにルートオブジェクトに作用します(この場合はBeanExpressionContext)。

Testがサブクラス化されている場合は実際のクラスを取得しようとしている場合を除いて、ここで​​を使用できない理由はわかりません。

これはできません。

EnvironmentAwareを実装し、環境からプロパティを取得することでブール値を設定する方が簡単かもしれません。

+0

私はちょうどそれを行い、「環境」を注入して値を調べました。私は、a)リファクタリングがそれを壊すので、クラス名をハードコードしたくなかった。b)サブクラスでは機能しないだろう。 –

関連する問題