【问题标题】:Reading yaml config读取 yaml 配置
【发布时间】:2017-11-02 19:07:28
【问题描述】:

几个小时以来,我一直在努力解决这个问题,但我做错了什么并没有多大意义。我正在尝试从 .yml 文件在 Java 中创建一个 Map 对象。原因是地图,我不知道“现在”下会出现什么/多少孩子,所以我宁愿有一种动态的方式来创建地图对象..

下面是我的 .yml 文件。我想要“present”下的键值对:

present:
    now: LOCAL TESTING
    later: testing

下面是我的配置类(所有注释掉的都是我尝试过的 - 以不同的组合):

//@Data
@Component
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "present")
//@ConfigurationProperties
public class stat {

    //@Getter
    //@Data
    @Value("${present}")
    private Map<String, String> present;
    //private Map<String, String> present = new HashMap<String, String>();

}

我尝试查看其他 SO 帖子,我觉得我理解它,但我的 Spring Boot (v1.5.8) 应用程序没有看到那个价值。它不断为我抛出错误或地图对象为空(或未填充)。

我知道我可以从这个 .yml 文件中读取值,因为如果我尝试使用下面的代码 sn-p 获取单个值,它会起作用:

@Data
@Value("${present.now}")
private String status; // String value "LOCAL TESTING"

以下是我尝试过的其他链接:

Spring Boot yaml configuration for a list of strings

how to convert yml file to java pojo

我是否遗漏了一些明显的东西?谢谢!

【问题讨论】:

    标签: java spring-boot yaml


    【解决方案1】:

    您可以尝试创建一个 POJO 来表示您尝试从中读取的 yml 结构。

    例如:

    @Configuration
    @ConfigurationProperties(prefix = "present")
    @Data
    public class Present {
    
        private String now;
    
        private String later;
    }
    

    【讨论】:

    • 感谢您的回复,但我正在尝试从中创建地图对象。我在原始问题中没有提到的是我不认识孩子(除了不会有重复的键),也就是说,我宁愿创建一个可以动态创建地图对象的 POJO,而不是硬编码这些值.
    【解决方案2】:

    所以我想通了(对于那些后来有这个问题的人):

    不需要@Value 并且不需要@ConfigurationProperties 中的前缀参数。

    然后你需要为你想要的字段设置一个 getter 方法 - 我以为 Lombok 库已经自动生成了这些,但我错了(可能需要稍后阅读更多相关信息 - @Setter 和 @Data 无法正常工作)。

    所以它应该看起来像这样:

    @Component
    @EnableConfigurationProperties
    @ConfigurationProperties
    public class stat {
    
        private Map<String, String[]> present = new HashMap<String, String[]>(); 
    
        public Map<String, String[]> getPresent() {
            return present;
        }
    }
    

    现在让我们举一个更复杂的例子(嵌套地图)。假设我的 .yml 文件如下所示:

    parent: 
        present:
            foo: dey, tok
            bar: ar, jerbs
        later:
            foo: day, dok
            mar: r, darbs
    

    POJO 看起来像这样:

    @Component
    @EnableConfigurationProperties
    @ConfigurationProperties
    public class stat {
    
        private Map<String, Map<String, String[]>> parent = new HashMap<String, Map<String, String[]>>();
    
        public Map<String, Map<String, String[]>> getParent() {
            return parent;
        }
    }
    

    要注意的另一件事是,您从中获取值的字段必须与变量名称匹配 - 如果您使用前缀可能无关紧要,但它仍然对我不起作用。希望这可以帮助。

    【讨论】:

      猜你喜欢
      • 2021-10-23
      • 1970-01-01
      • 1970-01-01
      • 2020-05-31
      • 2017-10-10
      • 2022-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多