web-dev-qa-db-ja.com

Spring Bootは@ValueをEnumに大文字と小文字を区別せずバインドします

列挙型

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 [〜#〜]AbcAbCabcどのパターンでも機能するはずです。

注:私はこの質問を見ました- Spring 3.0 MVCバインディングEnums Case Sensitive が、私の場合、10を超える列挙型/値(およびさらに多くのクラスがあることを期待)があり、10個の異なるカスタムプロパティバインダーを実装することになります痛い、私はいくつかの一般的な解決策が必要です。

13

@Value@ConfigurationPropertiesの機能が一致しません。 @ConfigurationPropertiesの方が優れていることを十分に強調できませんでした。

まず、簡単なPOJOで構成を設計します。これは、(タイプミスで簡単に壊すことができるアノテーション内の式を使用するのではなく)どこにでも注入できるようにします。第2に、メタデータのサポートにより、非常に簡単にIDE =自分の鍵用

そして最後に、ドキュメントで説明されているリラックスしたバインディングは@ConfigurationPropertiesにのみ適用されます。 @ValueはSpring Frameworkの機能であり、リラックスしたバインディングを認識していません。我々は ドキュメントでそれをより明確にする意図 です。

TL; DR abc@ConfigurationPropertiesでは機能しますが、@Valueでは機能しません。

13
Stephane Nicoll

値では大文字と小文字が区別され(環境から挿入されたキーまたはパスワードを考慮してください)、リラックスしたバインディングはキーにのみ適用されます。 Java enum名も大文字と小文字が区別され(Aaは異なる値です)、大文字と小文字を区別する必要はありません。

構成プロパティで正しい大文字小文字を使用するだけです。

3
chrylis

ConfigurationPropertis(afaik)の問題は、コンストラクター注入を使用できず、クラスが変更可能でなければならないことです。

回避策(または、必要に応じてハック)は、次のように、SpELを使用して、プロパティを検索する前に大文字にすることです。

@Value("#{'${custom.property}'.toUpperCase()}") Property property

Enumsインスタンスは定数であり、常に大文字で定義する必要があるため、これは機能するはずです。 https://docs.Oracle.com/javase/tutorial/Java/javaOO/enum.html

3
Morten Berg