2012-08-16 1877 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; 

将在设置的字符串值,没有任何其他配置。

相关问题