阅读yaml配置

时间:2017-11-02 19:07:29

标签: java spring-boot yaml

我一直试图绕过这个问题好几个小时,但我做错了什么并不是很有意义。我试图用.yml文件在Java中创建一个Map对象。对于地图的原因,我不知道在#34; present"下会出现什么/有多少孩子,所以我宁愿采用动态方式创建地图对象......

下面是我的.yml文件。我希望"现在":

下的键值对
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文件读取值,因为如果我尝试使用下面的代码片段获取单个值,则可以正常工作:

@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

我错过了一些明显的东西吗?谢谢!

2 个答案:

答案 0 :(得分:0)

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

例如:

@Configuration
@ConfigurationProperties(prefix = "present")
@Data
public class Present {

    private String now;

    private String later;
}

答案 1 :(得分:0)

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

不需要@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;
    }
}

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