【问题标题】:Spring @Value annotation with List and default value带有 List 和默认值的 Spring @Value 注释
【发布时间】:2021-09-09 11:48:56
【问题描述】:

我在配置文件中有一个属性,其中包含这种格式的值列表。格式必须保持不变。 myapp.values=value1,value2,value2

我在我的配置类中使用这些值:

@Value("#{'{myapp.values}'.split(,)}")
private List<String> values;

我的问题是,如果配置文件中没有这样的属性或属性为空,有没有办法设置默认值(空列表或 null)?

我试图用谷歌搜索,但没有成功。人们要么使用不适合我的myapp.values={value1,value2,value3},要么使用其格式,要么使用简单变量的默认值,而不是列表。

我的问题只是关于通过更改 @Value 注释来实现目标。请不要建议解决方法

【问题讨论】:

    标签: java spring spring-annotations


    【解决方案1】:
    @Value("${myapp.values:}#{T(java.util.Collections).emptyList()}")
    private List<String> defaultToEmpty;
    

    @Value("#{T(java.util.Arrays).asList('${myapp.values:}')}")
    private List<String> defaultToEmpty = new ArrayList();
    

    【讨论】:

    • 由于某种原因,第一个解决方案在 WildFly 中不起作用。如果有多个值,它不会拆分它们并将整个字符串作为第一个元素。第二种解决方案工作正常。在 Spring Boot 中两者都可以工作。
    【解决方案2】:

    实际上,只有一个符号 :empty default 值会起作用:

    @Value("${myapp.values:}")
    private List<String> values;
    

    【讨论】:

    • 奇怪。这是我的第一个猜测,但是互联网上到处都有信息,如果您在属性文件中的列表不是 {1,2,3} 格式,那么简单的 ${myapp.values} 不会正确解析它。这就是为什么我什至没有尝试并坚持使用 split(,) 不允许使用 : 这样简单的原因。谢谢,它有效。
    • 由于某种原因,这在 WildFly 中不起作用。如果有多个值,它不会拆分它们并将整个字符串作为第一个元素。但在 Spring Boot 中它可以正常工作。
    猜你喜欢
    • 1970-01-01
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    • 2020-02-12
    相关资源
    最近更新 更多