我目前正在使用这样的@Value Spring 3.1.x 注释:
@Value("${stuff.value:}")
private String value;
如果属性不存在,这会将一个空字符串放入变量中。我想将 null 作为默认值,而不是空字符串。当然,我也想避免在属性 stuff.value 未设置时出现错误。
我目前正在使用这样的@Value Spring 3.1.x 注释:
@Value("${stuff.value:}")
private String value;
如果属性不存在,这会将一个空字符串放入变量中。我想将 null 作为默认值,而不是空字符串。当然,我也想避免在属性 stuff.value 未设置时出现错误。
您必须设置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 测试
感谢@vorburger:
@Value("${email.protocol:#{null}}")
String protocol;
将字符串值设置为null而无需任何其他配置。
我给予@nosebrain 信用,因为我不知道“空值”,但我更愿意完全避免使用空值,特别是因为它难以null
在属性文件中表示。
但是这里有一个使用 null 而没有 out 的替代方法,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;
}
}
以上对我来说很好。你避免空值。如果您的属性文件想要明确设置他们不想处理它,那么您可以这样做(但您甚至不必指定它,因为它默认为 NOTSET)。
crap=NOTSET
null
非常糟糕,与 不同NOTSET
。这意味着弹簧或单元测试没有设置它,这就是恕我直言的原因。我仍然可能会使用 setter 表示法(上一个示例),因为它更容易进行单元测试(私有变量很难在单元测试中设置)。
如果您需要注入一个空的(0 长度)“”字符串作为 @Value 默认值 - 使用 SPEL(弹簧表达式语言),如下所示:
@Value("${index.suffix:#{''}}")
private String indexSuffix;
#{''} 只是为您提供一个空字符串作为注入@Value 的默认值。
由 yl