【问题标题】:Spring @Value - Is there a way to assign a default empty map?Spring @Value - 有没有办法分配一个默认的空地图?
【发布时间】:2020-11-20 08:02:36
【问题描述】:

情况

我在我的班级中使用@PropertySource 和@Value,以便将值从属性文件注入到地图中。 代码如下:

@Value("#{${global.fieldsSubset}}")
private final Map<String, Set<String>> fieldsSubset = new HashMap<>();

如果找不到所需的属性,我想将地图初始化为空地图。为此,我将代码更改为:

@Value("#{${global.fieldsSubset : {:}}}")
private final Map<String, Set<String>> fieldsSubset = new HashMap<>();

问题

默认行为正常,当找不到属性时地图为空,但当属性存在时,默认值仍然保留,地图始终为空。

这是全班:

@Configuration
@PropertySource(value = "classpath:global.properties", ignoreResourceNotFound = true)
@RefreshScope
public class FieldsSubsetsProperties {
    @Value("#{${global.fieldsSubset:{:}}}")
    private final Map<String, Set<String>> fieldsSubset = new HashMap<>();

    public Map<String, Set<String>> getFieldsSubset() {
        return fieldsSubset;
    }

    public Set<String> getSubsetOfFieldsNames(String subsetName) {
        return fieldsSubset.getOrDefault(subsetName, 
     Collections.emptySet());
    }
}

这是属性值:

global.fieldsSubset = {\
 'channel-basic':{'id', 'number', 'name'}, \
 'channel':{'id', 'number', 'name', 'description', 'status'}\
}

【问题讨论】:

标签: java spring spring-el


【解决方案1】:

我认为你有 2 个错误:

  1. 在字段的声明中,final 是错误的。该字段必须是非final的,这样Spring可以在构造完bean实例后设置它的值
  2. JSON 错误。 Set 映射到 JSON 列表,因此 JSON 应该是 'channel':['id', 'number', 'name', 'description', 'status'],这意味着您应该使用括号而不是大括号来表示映射的值

【讨论】:

    【解决方案2】:

    试试这个:

    @Value("#{${global.fieldsSubset:{T(java.util.Collections).emptyMap()}}}")
    private final Map<String, Set<String>> fieldsSubset = new HashMap<>();
    

    【讨论】:

      【解决方案3】:
      @Value("#{systemProperties['some.key'] ?: 'my default system property value'}")
      private String spelWithDefaultValue;
      

      更多关于默认值的信息:https://www.baeldung.com/spring-value-defaults

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-11-11
        • 1970-01-01
        • 1970-01-01
        • 2022-12-01
        • 2022-08-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多