@Valueをオプションとして定義する方法


119

Spring Beanには次のものが含まれています。

@Value("${myValue}")
private String value;

値は正しく注入されます。ただし、変数はオプションである必要があり、コマンドラインパラメーターとして渡され(SimpleCommandLinePropertySourceを使用してSpringコンテキストに追加されます)、この引数は常に存在するわけではありません。

デフォルト値を提供するために、次の両方を試しました。

@Value("${myValue:}")
@Value("${myValue:DEFAULT}")

ただし、いずれの場合も、実際の値がある場合でも、コロンの後のデフォルト引数が注入されます。これは、Springが注入する必要があるものをオーバーライドするように見えます。

@Valueが不要であることを指定する正しい方法は何ですか?

ありがとう


それは非常に奇妙です...デフォルト値はデフォルト値としてのみ機能する必要があります(つまり、プロパティが定義されていない場合)「実際の値がある場合でもデフォルト値が挿入される」というステートメント(たとえば、古いコンパイル済みクラスがない場合)を再確認できますか?
Pavel Horal 2014

7
@Value("${some.prop:}")私のために働きます。それがその変数の唯一の注釈です。
Zarathustra 2014年

アプリケーション構成を投稿できますか?
Vladimir Vagaytsev 2016年

@Autowired(必須= false)?
Andrew Scott Evans

回答:


179

@Valueが不要であることを指定する正しい方法は何ですか?

「必要ない」とはあなたが意味するという仮定に取り組んでいるnull...

:文字の右側にデフォルト値を指定できることを正しく述べました。あなたの例はでした@Value("${myValue:DEFAULT}")

デフォルト値としてプレーンな文字列に限定されません。SPEL式を使用できます。返される単純なSPEL式nullは次のとおりです。

@Value("${myValue:#{null}}")

49

Java 8を使用している場合は、そのjava.util.Optionalクラスを利用できます。この方法で変数を宣言する必要があります。

@Value("${myValue:#{null}}")
private Optional<String> value;

次に、より適切な方法で値が定義されているかどうかを確認できます。

if (value.isPresent()) {
    // do something cool
}

それが役に立てば幸い!


4
intelliJのアイデアによると。Optionalクラスフィールドで型を使用することはベストプラクティスではありません。
FıratKÜÇÜK

2
これを行うと、NPEがスローされます。 value無効です。
aatk 2018

1
@aatkあなたが説明する問題は少なくとも4.3.13以降修正されているようです。説明された宣言を使用しても問題ありません。nullable値を使用する方が良いですが、blog.joda.org
Torben

2
「intelliJのアイデアによると、クラスフィールドでオプションの型を使用することはベストプラクティスではありません。」Optionalをインスタンス変数として使用することの何が問題になっていますか?ゲッターで使用する場合と比較して、それだけが長寿命です...そして、そのようなフィールドは、シリアル化のために一時的とマークする必要がありますか?
Andrey M. Stepanov
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.