2017-01-25 22 views
4

SpELを使用したSpring @Valueアノテーションで興味深い問題があります。デフォルト値のnullを設定すると、String変数に対して機能します。しかし、Set変数の場合はそうではありません。java.util.Set変数のSpring @Valueでデフォルト値をnullに設定します

だから、この作品(varStrはnullである):

@Value("${var.string:#{NULL}}") 
private String varStr; 

、これはそうではない(varSetは今 "#{NULL}" で一つの要素が含まれています):

@Value("#{'${var.set:#{NULL}}'.split(',')}") 
private Set<String> varSet; 

質問これをSet変数でも動作させる方法です。デフォルトではnullに設定されています。

お手数をおかけします。

+1

このように注入された依存性を 'null'にデフォルト設定したいのは非常に奇妙なようです。 – Makoto

+1

これは非常に奇妙なことだと私は同意しますが、なぜこの表現を引用符で '' $ {var.set:#{NULL}} ''と書かれたのでしょうか? – Andremoniy

+0

私は個人的にフィールドインジェクションを使用せず、常にコンストラクタインジェクションを使用します。このように、本当に必要な場合は、コンストラクタでフィールド値を 'null'に設定することができます。 – Brad

答えて

2

PropertySourcesPlaceholderConfigurerを作成できます。このBeanはプロパティーのソース値を代行受信し、それらを構成することを許可します。

@Configuration 
@ComponentScan 
class ApplicationConfig { 

@Bean 
public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() { 
    PropertySourcesPlaceholderConfigurer c = new PropertySourcesPlaceholderConfigurer(); 
    c.setNullValue(""); 
    return c; 
} 

参考:空の文字列は、デフォルトでnullになります

http://blog.codeleak.pl/2015/09/placeholders-support-in-value.html

+0

申し訳ありませんが、私の場合に違いを生じさせるようではありません。 – Erikson

0

これを回避するための優雅な解決策が見つからない限り、コンストラクタにStringとしてプロパティを注入してからSplit()と入力するか、デフォルトでnullに設定してください。

class Foo { 

    private Set<String> varSet; 

    public Foo(@Value("${var.string:#{NULL}}") String varString) { 
     varSet = (varString == null) ? null : new HashSet<>(Arrays.asList(varString.split(","))); 
    } 
} 
+0

はい、おそらく、Stringを取得して分割を適用することに解決しなければなりません。 – Erikson

4

@Valueをセットではなく配列に注入できます。その後、@PostConstruct initブロックで目的のSetインスタンスに変換します。このようなプロパティが存在しない場合、Springは空の配列(nullではない)を注入しているように見えます(@Value文字列の空のデフォルト値に注意してください)。それが存在するときは、デフォルトでコンマで分割されます。このよう

@Value("${some.prop:}") 
private String[] propsArr; 
private Set<String> props; 

@PostConstruct 
private void init() throws Exception { 
    props = (propsArr.length == 0) ? null : Sets.newHashSet(propsArr); 
} 

私はただ一つの他の提案を行います。 nullを使用せず、代わりに空のセットを使用することをお勧めします。 nullはエラーを起こしやすい傾向があり、空のコレクションより多くの情報を伝えません。あなたのケースは異なる可能性があります - これは単なる一般的な勧告です。

BTW - そのSets.newHashSet(...)コールはGoogle's Guava libraryです。強くお勧めします。

+0

ありがとうPedorro。 SpELを使ってすべてをやろうとしていたので、@ PostConstructと余分なコーディングを避けました。それでも、あなたと一緒に解決策をとってきました。 – Erikson

関連する問題