我一直试图绕过这个问题好几个小时,但我做错了什么并不是很有意义。我试图用.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
我错过了一些明显的东西吗?谢谢!
答案 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;
}
}
另一个需要注意的关键事项是,您从中获取值的字段必须与变量名称匹配 - 如果您使用前缀可能无关紧要,但它仍然不适用于我。希望这可以帮助。