首页 > 解决方案 > 尝试从 yml 文件中读取 int 数组列表并使用 spring 注释 @Value List 加载

问题描述

我正在尝试将 .yml 文件中的属性注入到带有 @Value 注释的字段中。

        @Value("#{'${dataconfig.range-List}'.split(',')}")
private List<int[]> rangeList;

应用程序.yml 文件

    range-List: [ [ 160,30,30 ],
                 [ 311,60,60 ],
                 [ 361,480,360 ] ]

我试过跟随但没有任何效果

@Value("#{'${dataConfig.range-List}'.split(',')}")
private List<int[]> rangeList;

@Value("#{'${dataConfig.range-List:range-List}'}")
private List<int[]> rangeList;

标签: javaarraysspring-bootannotations

解决方案


我不认为你可以直接这样做,但你可以采取这样的替代路线:

.yml1 -按如下方式更新您的文件:

custom:
  rangeList[0]: "[160,30,30]"
  rangeList[1]: "[311,60,60]"
  rangeList[2]: "[361,480,360]"

2 - 添加一个ConfigurationProperties以读取范围列表设置。(您可以编写更短的代码进行转换。)

@Configuration
@ConfigurationProperties(prefix = "custom")
public class CustomConfigurationProperties {

    private List<String> rangeList;
    private List<int[]> rangeListWithArray = new ArrayList<>();

    public CustomConfigurationProperties(List<String> rangeList) {
        this.rangeList = rangeList;
    }

    public List<String> getRangeList() {
        return rangeList;
    }

    public void setRangeList(List<String> rangeList) {
        this.rangeList = rangeList;
        this.converter();
    }

    private void converter() {
        for (String range : this.rangeList) {
            String[] values = range
                    .replaceAll("\\[", "")
                    .replaceAll("\\]", "")
                    .replaceAll("\\s", "")
                    .split(",");
            int[] result = new int[values.length];

            for (int i = 0; i < values.length; i++) {
                try {
                    result[i] = Integer.parseInt(values[i]);
                } catch (NumberFormatException nfe) {}
            }
            this.rangeListWithArray.add(result);
        }
    }
}

3 - 您现在可以通过注入在任何地方使用它CustomConfigurationProperties

如果单击此处,您将更详细地探索@ConfigurationProperties描述。


推荐阅读