【问题标题】:Can I set null as the default value for a @Value in Spring?我可以将 null 设置为 Spring 中 @Value 的默认值吗?
【发布时间】:2012-08-13 00:58:17
【问题描述】:

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

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

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

【问题讨论】:

    标签: java spring spring-annotations


    【解决方案1】:

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

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

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

    由 yl

    【讨论】:

    • 最初的@Value("${stuff.value:}") private String value; 的作用完全相同,并且是首选的方法。无论如何,您的回复并没有回答问题。
    【解决方案2】:

    感谢@vorburger:

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

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

    【讨论】:

    • 在 spring-boot 上一个 2019 版本中工作:2.1.7.RELEASE ...start.spring.io
    • 也适用于 Spring Boot 2.5.6
    【解决方案3】:

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

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

    this question

    【讨论】:

    • 应该选择这个作为问题的答案。
    【解决方案4】:

    我对 @nosebrain 表示赞赏,因为我不知道“空值”,但我更愿意完全避免使用空值,特别是因为它难以在属性文件中表示 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 切换更容易。它也更容易进行单元测试:)

    编辑:基于您的 cmets 使用枚举和我不使用 null 的意见。

    @Component
    public class MyObject {
    
        @Value("${crap:NOTSET}")
        private Crap crap;
    
        public enum Crap {
            NOTSET,
            BLAH;
        }
    }
    

    以上对我来说很好。你避免空值。如果您的属性文件想要明确设置他们不想处理它,那么您可以这样做(但您甚至不必指定它,因为它默认为 NOTSET)。

    crap=NOTSET
    

    null 非常糟糕,与NOTSET 不同。这意味着弹簧或单元测试没有设置它,这就是恕我直言的原因。我仍然可能会使用 setter 表示法(上一个示例),因为它更容易进行单元测试(私有变量很难在单元测试中设置)。

    【讨论】:

    • 字符串值是一个例子,我真的需要这个枚举值,空字符串只会导致转换错误。使用@null,您可以将 null 设置为“未设置枚举”,这正是我所需要的。
    • 我不推荐 null 而是推荐一些表示未设置的枚举的更多原因。
    • 这需要将 Enum.NOTSET 放入所有属性文件 (>30) 中,这似乎需要做很多工作而几乎没有任何好处...
    • 我没试过,但理论上@Value("${stuff.value:NOTSET}") 不会工作?
    • 是的,这是一个很好的解决方案。不幸的是,我无法更改枚举(dep),所以我必须使用 null。否则你是对的,NOTSET 会起作用。
    【解决方案5】:

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

    【讨论】:

    • 与此等效的 Java 配置是什么?
    • stackoverflow.com/questions/9347929/… 提到使用 ${some.param:#{null}},这对我有用而无需设置 nullValue,似乎这是默认设置? (在 Spring Boot 应用程序中。)
    • 按 vorburger 和stackoverflow.com/questions/16735141/… 建议的 SPEL ${stuff.value:#{null}} 的简单使用能力
    • 似乎对于 ben3000 和 JRichardsz 的回答需要更少的配置。
    • 有一种更新的方法可以将null 设置为默认值,请在此处查看最新答案
    猜你喜欢
    • 2011-04-05
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    • 2011-10-24
    • 1970-01-01
    相关资源
    最近更新 更多