環境変数からマップにバインドされたプロパティを取得したいと思います。プロパティがで定義されている場合 application.properties
バインディングは正しく機能します。ただし、プロパティがENV変数として定義されている場合、バインディングは失敗します。
次の例を検討してください。
@ConfigurationProperties("com.test")
public class Props {
private Map<String, Map<String, String>> property;
}
次のENV変数は、マップとしてマップされることが期待されています [property={foo={bar=VALUE}}]
.
export COM_TEST_PROPERTY_FOO_BAR=VALUE
しかし、バインディングの失敗
Failed to convert property value of type "java.lang.String" to required type "java.util.Map" for property "property[FOO_BAR]"; nested exception is java.lang.IllegalStateException: Cannot convert value of type "java.lang.String" to required type "java.util.Map" for property "property[FOO_BAR]": no matching editors or conversion strategy found
に基づく ドキュメンテーション 私はまた、カスタムを作成しようとしました Converter
を使用して @ConfigurationPropertiesBinding
それを登録しますが、このアプローチではキーにアクセスすることはできず、値にのみアクセスできます。
私もカスタムを登録しようとしました PropertyEditor
、登録されていないようですが、別の方法で登録する必要がありますか?
@Bean
@ConfigurationPropertiesBinding
public CustomEditorConfigurer customEditorConfigurer() {
CustomEditorConfigurer pe = new CustomEditorConfigurer();
pe.setCustomEditors(Collections.singletonMap(Map.class, KeyPropertyEditor.class));
return pe;
}
これを使って試してみることができます デモアプリ
1を編集 私は "育った 問題
編集2
Spring Boot 2で修正されます
回答:
回答№1は0編集:本当に欲しいものに関して:application.propertiesファイルとして以下を使用します。
com.test.some.key=${COM_TEST_PROPERTY_SOME_KEY}
com.test.other.key=${COM_TEST_PROPERTY_OTHER_KEY}
面倒なことはわかっていますが、うまくいくはずです。
また、COM_TEST_PROPERTYで始まるすべてのプロパティを後処理し、解析し、必要なパスに分割して、環境に注入することもできますが、これにはより多くのコードが必要になります。