【问题标题】:Spring @Value empty list as defaultSpring @Value 空列表作为默认值
【发布时间】:2017-08-12 17:38:18
【问题描述】:

有没有办法在 Spring 中将空列表设置为属性的默认值,例如:

@Value("${my.list.of.strings :" + new ArrayList<>() + "}")
private List<String> myList;

显然不是新的 ArrayList,但我需要一个空列表来代替。

【问题讨论】:

  • private List&lt;String&gt; myList = new ArrayList&lt;&gt;() 还不够吗?

标签: java spring spring-annotations


【解决方案1】:

查看 SpEL 规范并结合@javaguy 的回答后,我想出了这个:

@Value("${my.list.of.strings:}#{T(java.util.Collections).emptyList()}")
private List<String> myList;

【讨论】:

  • 我的回答创建了一个空列表,如果有帮助,您可以接受它
  • 您的回答很有帮助但不完整,因为值注释首先指向一个属性(应在不存在时对其进行初始化 - 否则会导致 IllegalArgumentException)
  • 我在我的项目中将它用于零大小的list,但没有得到任何IllegalArgumentException
  • 不知道你的代码,但是如果我指定一个没有默认值且没有出现在任何属性文件中的属性,我的代码就会中断
  • 似乎有效,但不知道为什么。我希望空列表直接在冒号之后,而不是在右括号 } 之后。
【解决方案2】:

实际上,在当前的 Spring 版本中,只有一个符号 :empty default值。

我正在使用的完整示例:

@Value("${my.custom.prop.array:}")
private List<Integer> myList;

为了确保安全,我还将 init 添加到 List 变量中:

@Value("${my.custom.prop.array:}")
private List<Integer> myList = new ArrayList<>();

【讨论】:

【解决方案3】:
@Value("#{T(java.util.Arrays).asList('${my.list.of.strings:}')}")
private List<String> myList;

适用于我,使用 Spring 5.0.x(如果您的 my.list.of.strings 属性未在上下文中配置,则提供空列表)

之后你可以轻松地做类似的事情

CollectionUtils.isNotEmpty(myList)

【讨论】:

    【解决方案4】:

    您可以使用Collections.emptyList() 以零大小填充空列表对象,如下所示:

    @Value("#{T(java.util.Collections).emptyList()}")
    private List<String> myList;
    

    这会给你一个零大小的myList

    【讨论】:

    • 这里的“T”有什么意义?
    • @flash,它允许将参数重新解释为类对象。接下来在java.util.Collections.class类上调用静态方法.emptyList()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    • 2022-11-05
    • 2020-10-06
    • 2019-01-13
    • 2015-10-21
    相关资源
    最近更新 更多