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

时间:2012-08-16 16:00:40

标签: java spring spring-annotations

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

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

如果属性不存在,这会将空字符串放入变量中。我想将null作为默认值而不是空字符串。当然,我还想在未设置属性stuff.value时避免错误。

5 个答案:

答案 0 :(得分:126)

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

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

请参阅this question

答案 1 :(得分:56)

您必须设置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 :(得分:16)

感谢@vorburger:

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

将字符串值设置为 null ,而不进行任何其他配置。

答案 3 :(得分:0)

我给@nosebrain信用,因为我不知道“null-value”,但我更愿意完全避免使用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成为逗号分隔值,或者也许对于Enum,开关更容易。它也更容易进行单元测试:)

编辑:根据您对使用枚举的评论以及我对不使用null的看法。

@Component
public class MyObject {

    @Value("${crap:NOTSET}")
    private Crap crap;

    public enum Crap {
        NOTSET,
        BLAH;
    }
}

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

crap=NOTSET

null非常糟糕,与NOTSET不同。这意味着弹簧或单元测试没有设置它,这就是为什么有恕我直言的差异。我仍然可能使用setter表示法(前面的例子)作为单元测试更容易(私有变量很难在单元测试中设置)。

答案 4 :(得分:0)

如果您需要将一个空(长度为0)“”字符串作为@Value默认值插入-请使用SPEL(春季表达语言),如下所示:

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

#{''}只是为您提供一个空字符串,作为注入@Value的默认值。

由yl