128

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

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

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

4

5 回答 5

280

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

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

看到这个问题

于 2015-11-13T06:47:19.997 回答
75

您必须设置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 测试

于 2012-08-16T18:47:31.440 回答
73

感谢@vorburger:

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

将字符串值设置为null而无需任何其他配置。

于 2017-07-31T07:26:59.543 回答
2

我给予@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 表示法(上一个示例),因为它更容易进行单元测试(私有变量很难在单元测试中设置)。

于 2012-08-16T20:55:24.803 回答
0

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

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

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

由 yl

于 2020-06-16T12:32:38.633 回答