2012-08-16 164 views

回答

46

您必須設置PropertyPlaceholderConfigurer的nullValue。例如,我使用字符串@null,但您也可以使用空字符串作爲nullValue。現在

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <!-- config the location(s) of the properties file(s) here --> 
    <property name="nullValue" value="@null" /> 
</bean> 

您可以使用字符串@null代表null

@Value("${stuff.value:@null}") 
private String value; 

請注意:上下文名稱空間不支持目前的空值。不能使用

<context:property-placeholder null-value="@null" ... /> 

與Spring 3.1.1測試

+2

這是什麼Java等同的配置? – 2014-08-21 06:53:15

+18

http://stackoverflow.com/questions/9347929/spring-set-a-property-only-if-the-value-is-not-null提及使用$ {some.param:#{null}},那爲我工作,而不必設置nullValue,似乎這是默認? (在Spring Boot應用程序中)。 – vorburger 2014-10-05 21:43:18

+3

vorburger建議的SPEL $ {stuff.value:#{null}}的簡單使用功能以及 http://stackoverflow.com/questions/16735141/specify-default-property- value-as-null-in-spring – csf 2015-09-30 16:41:28

2

我給@nosebrain信用,因爲我不知道「空值」,但我更喜歡完全避免使用空值,特別是因爲它的難以在屬性文件中表示null

但是,這是一個替代方案,使用空值null-value,所以它將與任何屬性佔位符一起工作。

public class MyObject { 

    private String value; 

    @Value("${stuff.value:@null}") 
    public void setValue(String value) { 
     if ("@null".equals(value)) this.value = null; 
     else this.value = value; 
    } 
} 

個人而言,我更喜歡我的方式,因爲說不定以後你想stuff.value是一個逗號分隔值或也許ENUM開關很省力。它也更容易進行單元測試:)

編輯:根據您對使用枚舉和我的意見不使用null的意見。

@Component 
public class MyObject { 

    @Value("${crap:NOTSET}") 
    private Crap crap; 

    public enum Crap { 
     NOTSET, 
     BLAH; 
    } 
} 

上述工作適合我。你避免null。如果你的屬性文件想要明確設置他們不想處理它,那麼你可以(,但是你甚至不需要指定它,因爲它將默認爲NOTSET)。

crap=NOTSET 

null是非常糟糕的,比NOTSET不同。這意味着春季或單元測試沒有設置它,這就是爲什麼有恕我直言的區別。我仍然可能使用setter符號(前面的例子)作爲它更容易進行單元測試(私人變量很難在單元測試中設置)。

+0

字符串值是一個例子,我真的需要這樣的Enum值,其中一個空字符串只會導致轉換錯誤。用@null你可以有一個null作爲「no Enum set」,這就是我所需要的。 – 2012-08-17 11:23:13

+0

所有更多的原因,我不會推薦null,而是一些代表未設置的枚舉。 – 2012-08-17 12:07:49

+0

這需要將Enum.NOTSET放入所有屬性文件(> 30),這似乎很多工作幾乎沒有任何好處... – 2012-08-20 11:02:00

61

這真的很舊,但你現在可以使用Spring EL,例如

@Value("${stuff.value:#{null}}")

this question

4

感謝@vorburger:

@Value("${email.protocol:#{null}}") 
String protocol; 

將在設置的字符串值,沒有任何其他配置。

相關問題