【问题标题】:Read Integer List from yaml file从 yaml 文件中读取整数列表
【发布时间】:2019-07-30 09:12:15
【问题描述】:

目前的实现是:-

public static final List<Integer> validCodes = Collections.unmodifiableList(Arrays.asList(110, 210, 310,510,610));

但是,我对这种硬编码方法并不满意。我想让它可配置而不是硬编码。我想从 yaml 文件中读取这些值可以解决我的问题。

但是如何在 yaml 文件中定义整数列表并使用 @value 实现它。我可以找到很多关于读取字符串列表而不是整数的示例。

【问题讨论】:

标签: java arrays spring-boot yaml snakeyaml


【解决方案1】:

application.yml 文件中,定义配置变量如下。

my_integers: 1231,12323,12321

然后使用@Value 注解生成一个整数列表,如下所示。

@Value("#{'${my_integers}'.split(',')}")
private List<Integer> myIntegers;

其余的由 Spring 完成。您只需要根据需要使用myIntegers。 快乐的编码......

PS:我用过spring boot 2.0.*

【讨论】:

    【解决方案2】:

    您可以使用以下方法从 YML 文件中获取所有可用属性。当您使用以下方法时,您必须将以下 jar 添加到您的构建脚本中。

    compile group: 'org.yaml', name: 'snakeyaml', version: '1.12'   
    

    我认为这将帮助您继续您的任务。

    private Map<String, Object> loadYMLData() {
            Map<String, Object> result = new HashMap<String, Object>();
            try {
                String fileName = "{{YAMAL FILE NAME}}.yml";
                Yaml yaml = new Yaml();
                ClassLoader classLoader = getClass().getClassLoader();
                File file = new File(classLoader.getResource(fileName).getFile());
                InputStream ios = new FileInputStream(file);
    
                // Parse the YAML file and return the output as a series of Maps and Lists
                result = (Map<String, Object>) yaml.load(ios);
                System.out.println(result.toString());
    
            } catch (Exception e) {
                logger.error("Error==>", e);
            }
            return result;
        }
    

    【讨论】:

      【解决方案3】:

      一种方式:

      假设属性文件包含

      intArr={1,2,3}

      那么@Value可以这样使用:

      @Value("#{${intArr}}")
      Integer[] intArr;
      

      第二种方式:

      如果属性包含逗号分隔的值: intArr: [1, 2, 3]

      那么注释代码将是:

      @Value("${intArr}")
      private int[] intArr;
      

      编辑:

      您可以配置ConversionServiceFactoryBean,它会激活支持将字符串转换为集合类型的新配置服务。

      通过激活它,它将支持以下类型的转换:

       intArray= 1, 2, 3, 4
      

      还有如下代码:

      @Value("${intArray}")
      private List<Integer> myList;
      

      参考here

      【讨论】:

      • 我尝试了第二种方式:- intArr: [1, 2, 3] @Value("${intArr}") private List intArr;不工作!
      • 您是否在 yaml 属性中声明了要在 intArr 之前附加的前缀?
      • 不,没有前缀。它给出了一个空值@Vebbie
      • 好的。用另一种方法编辑答案。
      • 抱歉,我使用的是静态变量。这是空值的原因。但是,即使对于非静态变量,该方法也不起作用。它说无法解析占位符。但是,如果我把它作为 intArr: '1,2,3' ,它的工作。我猜 '[]' 括号会产生问题。但是,如果我使用 intArr: '1,2,3' ,它会变成一个字符串列表,但我想要一个整数列表
      猜你喜欢
      • 2023-03-03
      • 1970-01-01
      • 2019-11-06
      • 2019-01-09
      • 2017-09-11
      • 2018-09-24
      • 2019-01-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多