我目前正在使用@Value Spring 3.1.x注释,如下所示:
@Value("${stuff.value:}")
private String value;
如果属性不存在,则将空字符串放入变量中。我想将null作为默认值,而不是一个空String。当然,当未设置属性stuff.value时,我也想避免发生错误。
我目前正在使用@Value Spring 3.1.x注释,如下所示:
@Value("${stuff.value:}")
private String value;
如果属性不存在,则将空字符串放入变量中。我想将null作为默认值,而不是一个空String。当然,当未设置属性stuff.value时,我也想避免发生错误。
Answers:
您必须设置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;
请注意:上下文名称空间目前不支持null值。你不能用
<context:property-placeholder null-value="@null" ... />
在Spring 3.1.1中测试
感谢@vorburger:
@Value("${email.protocol:#{null}}")
String protocol;
无需任何其他配置即可将字符串值设置为null。
我感谢@nosebrain,因为我不知道“空值”,但是我宁愿避免完全使用空值,特别是因为它很难null
在属性文件中表示。
但是这是使用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
成为一个逗号分隔的值,或者对于枚举而言,切换起来会更容易。它也更容易进行单元测试:)
编辑:基于您对使用枚举的意见和我不使用null的意见。
@Component
public class MyObject {
@Value("${crap:NOTSET}")
private Crap crap;
public enum Crap {
NOTSET,
BLAH;
}
}
以上对我来说很好。您避免使用null。如果您的属性文件想要显式设置它们不想处理的属性,则可以这样做(但是您不必指定它,因为它默认为NOTSET)。
crap=NOTSET
null
是非常糟糕的,与NOTSET
。这意味着没有设置弹簧或单元测试,这就是恕我直言区别的原因。我仍然可能会使用setter表示法(前面的示例),因为它更易于进行单元测试(私有变量很难在单元测试中设置)。
@Value("${stuff.value:NOTSET}")
行不通的吗?