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


100

我目前正在使用@Value Spring 3.1.x注释,如下所示:

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

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

Answers:


66

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


2
Java配置与此等效吗?
Kumar Sambhav 2014年

30
stackoverflow.com/questions/9347929/…提到使用$ {some.param:#{null}},并且对我有用,而无需设置nullValue,这似乎是默认设置吗?(在Spring Boot应用程序中。)
vorburger 2014年


似乎ben3000和JRichardsz答案所需的配置要少得多。
杰夫

198

这确实很旧,但是您现在可以使用Spring EL,例如

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

看到这个问题


52

感谢@vorburger:

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

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


3
在最新版本的spring-boot中工作,最新版本为2019年:2.1.7.RELEASE ... start.spring.io
JRichardsz

2

我感谢@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表示法(前面的示例),因为它更易于进行单元测试(私有变量很难在单元测试中设置)。


字符串值是一个示例,我确实需要一个Enum值,其中一个空字符串只会导致转换错误。使用@null可以将null设置为“ no Enum set”,这就是我需要的。
凯文·施密特

更为什么我不建议使用null而是推荐一些未设置的枚举的原因。
亚当·根特

2
那将需要将Enum.NOTSET放入所有属性文件(> 30),这似乎是很多工作,几乎没有任何好处……
Kevin Schmidt

我没有尝试过,但理论上是@Value("${stuff.value:NOTSET}")行不通的吗?
亚当·根特

是的,这是一个很好的解决方案。不幸的是,我无法更改枚举(dep),因此必须使用null。否则,没错,NOTSET将起作用。
凯文·施密特 Kevin Schmidt)2012年

0

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

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

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

由yl

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.