列挙型
public enum Property {
A,
AB,
ABC;
}
フィールド
@Value("${custom.property}")
protected Property property;
application.properties(小文字)
custom.property=abc
アプリケーションを実行しているときにエラーが発生しました:
タイプ[Java.lang.String]の値を必要なタイプ[com.xxx.Property]に変換できません:一致するエディターまたは変換戦略が見つかりません。
一方(大文字):
custom.property=ABC
正常に動作します。
大文字と小文字を区別せずに値をバインドする方法はありますか? [〜#〜] abc [〜#〜]、Abc、AbC、abcどのパターンでも機能するはずです。
注:私はこの質問を見ました- Spring 3.0 MVCバインディングEnums Case Sensitive が、私の場合、10を超える列挙型/値(およびさらに多くのクラスがあることを期待)があり、10個の異なるカスタムプロパティバインダーを実装することになります痛い、私はいくつかの一般的な解決策が必要です。
@Value
と@ConfigurationProperties
の機能が一致しません。 @ConfigurationProperties
の方が優れていることを十分に強調できませんでした。
まず、簡単なPOJOで構成を設計します。これは、(タイプミスで簡単に壊すことができるアノテーション内の式を使用するのではなく)どこにでも注入できるようにします。第2に、メタデータのサポートにより、非常に簡単にIDE =自分の鍵用 。
そして最後に、ドキュメントで説明されているリラックスしたバインディングは@ConfigurationProperties
にのみ適用されます。 @Value
はSpring Frameworkの機能であり、リラックスしたバインディングを認識していません。我々は ドキュメントでそれをより明確にする意図 です。
TL; DR abc
は@ConfigurationProperties
では機能しますが、@Value
では機能しません。
値では大文字と小文字が区別され(環境から挿入されたキーまたはパスワードを考慮してください)、リラックスしたバインディングはキーにのみ適用されます。 Java enum名も大文字と小文字が区別され(A
とa
は異なる値です)、大文字と小文字を区別する必要はありません。
構成プロパティで正しい大文字小文字を使用するだけです。
ConfigurationPropertis(afaik)の問題は、コンストラクター注入を使用できず、クラスが変更可能でなければならないことです。
回避策(または、必要に応じてハック)は、次のように、SpELを使用して、プロパティを検索する前に大文字にすることです。
@Value("#{'${custom.property}'.toUpperCase()}") Property property
Enumsインスタンスは定数であり、常に大文字で定義する必要があるため、これは機能するはずです。 https://docs.Oracle.com/javase/tutorial/Java/javaOO/enum.html