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

我目前使用的@Value Spring 3.1. x 注释如下:

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

如果该属性不存在,则将一个空 String 放入变量中。我希望将 null 作为默认值,而不是空 String。当然,我还想避免在没有设置 stuff.value 属性时出现错误。

126235 次浏览

必须设置 PropertyPlaceholderConfigrer的 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" ... />

使用 Spring3.1.1进行测试

我认为@nosebrain 值得称赞,因为我不知道“ null-value”,但是我更喜欢避免使用 null 值,特别是因为它很难在属性文件中表示 null

但是这里有一种替代方法,即在没有 null-value的情况下使用 null,因此它可以使用任何属性占位符。

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;
}
}

以上这些对我来说都很好。你避免了无效。如果您的属性文件希望显式设置它们不想处理它,那么您可以这样做(但是您甚至不需要指定它,因为它将默认为 NOTSET)。

crap=NOTSET

null非常糟糕,与 NOTSET不同。这意味着弹簧或单元测试没有设置它,这就是为什么有一个区别。我仍然可能使用 setter 符号(前面的例子)作为更容易进行单元测试的符号(在单元测试中很难设置私有变量)。

这是非常古老的,但是您现在可以使用 Spring EL,例如。

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

参见 这个问题

感谢@vorburger:

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

将字符串值设置为 无效而不使用任何其他配置。

如果您需要注入一个空的(0长度)“”字符串作为@Value default-使用 SPEL (Spring 表达式语言) ,如下所示:

@Value("${index.suffix:#{''}}")
private String indexSuffix;

只会得到一个空字符串作为注入的@Value 的默认值。

被我