我想解析具有动态属性的yaml文件。所以,我有不同国家的yaml文件-荷兰.yml,美国.yml,英国.yml…等等
文件的内容如下所示-
netherlands:
name: netherlands
type: country
location:
latitude: aaa
longitude: bbb
amsterdam:
name: amsterdam
type: city
latitude: xxx
longitude: yyy
rotterdam:
name: rotterdam
type: city
latitude: ddd
longitude: ggg
hague:
name: hague
type: city
latitude: kkk
longitude: lll
我想在我的代码中以这种方式解析和读取它-
@country(name="netherlands")
Country country;
country.getAmsterdam.getLatitude()
我使用的是springboot和java11。如何使用注解来实现这一点?我想我需要为每个国家写一个自定义注解。但主要问题是,每个国家的城市名称都是动态的,城市数量也会因国家而异。另外,城市也可以在yaml中添加。我能够编写一个代码来解析yaml并将其Map到我的对象。但我现在看到的是,它需要Map到一个具有固定属性的类,这不是我的情况。这是我写的代码,但它不符合我的目的。
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
File file = new File(classLoader.getResource("netherlands.yml").getFile());
ObjectMapper om = new ObjectMapper(new YAMLFactory());
Country country = om.readValue(file, Country.class);
public class Country{
private String name ;
private String type;
private Location location;
// Here I need the dynamic attributes for my cities
}
我查了很多文章,但找不到这样的例子。你能提出一个实现这个目标的方法吗?非常感谢你的帮助。
1条答案
按热度按时间3xiyfsfu1#
如果您的.yml文件在运行时不会更改,您可以考虑使用@configurationproperties spring注解。
使用它可以创建@configuration类,如下所示:
您还需要使用本答案中描述的其他configs支持,以允许在@configurationproperties注解中看到您的netherlands.yml和其他文件。
关于动态字段生成-这是不可能的,因为java是静态类型化语言。如果你不知道城市的名字,你就不能和城市一起工作,这没有任何意义。因此,我建议您将.yml文件的结构更改为:
如果不可能的话。当你可以考虑使用
private final Map<String, Object> netherlands
.