我可以将null设置为Spring中@Value的默认值吗?

我目前正在使用像这样的@Value Spring 3.1.x注释:

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

如果该属性不存在,则会将一个空string放入该variables中。 我想有null作为默认,而不是一个空的string。 当然,我也想避免在没有设置属性stuff.value时出错。

您必须设置PropertyPlaceholderConfigurer的nullValue。 对于我使用的string@null但你也可以使用空string作为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> 

现在,您可以使用string@null来表示null

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

请注意:上下文名称空间此刻不支持空值。 你不能使用

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

用Spring 3.1.1testing

这真的很老,但你现在可以使用Spring EL,例如

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

看到这个问题 。

感谢@vorburger:

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

将string值设置为null,而不需要其他configuration。

我给@nosebrain信贷,因为我不知道“空值”,但我宁愿避免完全使用空值特别是因为它很难在属性文件中表示null

但是这里有一个替代方法,使用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是一个逗号分隔值或者也许是枚举开关更容易。 它也更容易unit testing:)

编辑:根据您对使用枚举的意见和我的意见不使用null。

 @Component public class MyObject { @Value("${crap:NOTSET}") private Crap crap; public enum Crap { NOTSET, BLAH; } } 

上述工作对我来说很好。 你避免null。 如果你的属性文件想显式设置他们不想处理它,那么你可以( 但是你甚至不需要指定它,因为它将默认为NOTSET )。

 crap=NOTSET 

null非常糟糕,与NOTSET不同。 这意味着春季或unit testing没有设置,这就是为什么有恕我直言的差异。 我仍然可能使用setter符号(前面的例子)作为它更容易进行unit testing(私人variables很难在unit testing中设置)。