Groovy 举例说明
我正在尝试使用读取和解析YAML文件,并将其转换为Java应用程序的配置POJO:Groovy 举例说明,groovy,yaml,snakeyaml,Groovy,Yaml,Snakeyaml,我正在尝试使用读取和解析YAML文件,并将其转换为Java应用程序的配置POJO: // Groovy pseudo-code class MyAppConfig { List<Widget> widgets String uuid boolean isActive // Ex: MyAppConfig cfg = new MyAppConfig('/opt/myapp/config.yaml') MyAppConfig(String con
// Groovy pseudo-code
class MyAppConfig {
List<Widget> widgets
String uuid
boolean isActive
// Ex: MyAppConfig cfg = new MyAppConfig('/opt/myapp/config.yaml')
MyAppConfig(String configFileUri) {
this(loadMap(configFileUri))
}
private static HashMap<String,HashMap<String,String>> loadConfig(String configFileUri) {
Yaml yaml = new Yaml();
HashMap<String,HashMap<String,String>> values
try {
File configFile = Paths.get(ClassLoader.getSystemResource(configUri).toURI()).toFile();
values = (HashMap<String,HashMap<String,String>>)yaml.load(new FileInputStream(configFile));
} catch(FileNotFoundException | URISyntaxException ex) {
throw new MyAppException(ex.getMessage(), ex);
}
values
}
MyAppConfig(HashMap<String,HashMap<String,String>> yamlMap) {
super()
// Here I want to extract keys from 'yamlMap' and use their values
// to populate MyAppConfig's properties (widgets, uuid, isActive, etc.).
}
}
既然SnakeYAML似乎只给了我一个HashMap,你的意思是这样的:
@Grab('org.yaml:snakeyaml:1.17')
import org.yaml.snakeyaml.*
import org.yaml.snakeyaml.constructor.*
import groovy.transform.*
String exampleYaml = '''widgets:
| - name: blah
| age: 3000
| silly: true
| - name: blah meh
| age: 13939
| silly: false
|uuid: 1938484
|isActive: false'''.stripMargin()
@ToString(includeNames=true)
class Widget {
String name
Integer age
boolean silly
}
@ToString(includeNames=true)
class MyConfig {
List<Widget> widgets
String uuid
boolean isActive
static MyConfig fromYaml(yaml) {
Constructor c = new Constructor(MyConfig)
TypeDescription t = new TypeDescription(MyConfig)
t.putListPropertyType('widgts', Widget)
c.addTypeDescription(t);
new Yaml(c).load(yaml)
}
}
println MyConfig.fromYaml(exampleYaml)
@Grab('org.yaml:snakeyaml:1.17')
导入org.yaml.snakeyaml*
导入org.yaml.snakeyaml.constructor*
导入groovy.transform*
字符串示例YAML=''小部件:
|-姓名:布拉
|年龄:3000
|傻瓜:真的
|-姓名:布拉梅
|年龄:13939
|傻瓜:错
|uuid:1938484
|isActive:false“”。stripMargin()
@ToString(includeNames=true)
类小部件{
字符串名
整数年龄
布尔傻子
}
@ToString(includeNames=true)
类MyConfig{
列表小部件
字符串uuid
布尔非活动
来自yaml的静态MyConfig(yaml){
构造函数c=新构造函数(MyConfig)
TypeDescription t=新的TypeDescription(MyConfig)
t、 putListPropertyType('widgts',小部件)
c、 addTypeDescription(t);
新Yaml(c).荷载(Yaml)
}
}
println MyConfig.fromYaml(示例YAML)
显然,这是一个在Groovy控制台中运行的脚本,您不需要@Grab
行,因为您的类路径中可能已经有了库;-) 你的意思是这样的:
@Grab('org.yaml:snakeyaml:1.17')
import org.yaml.snakeyaml.*
import org.yaml.snakeyaml.constructor.*
import groovy.transform.*
String exampleYaml = '''widgets:
| - name: blah
| age: 3000
| silly: true
| - name: blah meh
| age: 13939
| silly: false
|uuid: 1938484
|isActive: false'''.stripMargin()
@ToString(includeNames=true)
class Widget {
String name
Integer age
boolean silly
}
@ToString(includeNames=true)
class MyConfig {
List<Widget> widgets
String uuid
boolean isActive
static MyConfig fromYaml(yaml) {
Constructor c = new Constructor(MyConfig)
TypeDescription t = new TypeDescription(MyConfig)
t.putListPropertyType('widgts', Widget)
c.addTypeDescription(t);
new Yaml(c).load(yaml)
}
}
println MyConfig.fromYaml(exampleYaml)
@Grab('org.yaml:snakeyaml:1.17')
导入org.yaml.snakeyaml*
导入org.yaml.snakeyaml.constructor*
导入groovy.transform*
字符串示例YAML=''小部件:
|-姓名:布拉
|年龄:3000
|傻瓜:真的
|-姓名:布拉梅
|年龄:13939
|傻瓜:错
|uuid:1938484
|isActive:false“”。stripMargin()
@ToString(includeNames=true)
类小部件{
字符串名
整数年龄
布尔傻子
}
@ToString(includeNames=true)
类MyConfig{
列表小部件
字符串uuid
布尔非活动
来自yaml的静态MyConfig(yaml){
构造函数c=新构造函数(MyConfig)
TypeDescription t=新的TypeDescription(MyConfig)
t、 putListPropertyType('widgts',小部件)
c、 addTypeDescription(t);
新Yaml(c).荷载(Yaml)
}
}
println MyConfig.fromYaml(示例YAML)
显然,这是一个在Groovy控制台中运行的脚本,您不需要@Grab
行,因为您的类路径中可能已经有了库;-) 示例yaml文件?示例Widget
类显示您的问题?这个问题有点太模糊和影响深远(一个问题中有三个问题?)无法回答AddItStandsthanks@tim_yates(+1)-请参阅我的更新和示例YAML。我的猜测是#2和#3实际上是同一个问题,可以由真正了解SnakeYAML API的人一起回答#1是一个基本的用法问题。我相信你指的是“现状”(面向未来读者)。Re:“现状”--是的,愚蠢的电话自动更正;-)(还有我糟糕的校对技巧)yaml文件示例?示例Widget
类显示您的问题?这个问题有点太模糊和影响深远(一个问题中有三个问题?)无法回答AddItStandsthanks@tim_yates(+1)-请参阅我的更新和示例YAML。我的猜测是#2和#3实际上是同一个问题,可以由真正了解SnakeYAML API的人一起回答#1是一个基本的用法问题。我相信你指的是“现状”(面向未来读者)。Re:“现状”--是的,愚蠢的电话自动更正;-)(还有我糟糕的校对技能)谢谢@tim_yates(+1)-这正是我想要的(我知道必须有一个比使用原始地图更好的API)。如果exampleAML
中存在与MyConfig
类不匹配的意外/无效值,我是否可以假设SnakeYAML将抛出异常?再次感谢!是的,你会得到一个异常,比如在class:Widget上找不到属性'cheese'
谢谢@tim_yates(+1)-这正是我想要的(我知道必须有一个比使用原始地图更好的API)。如果exampleAML
中存在与MyConfig
类不匹配的意外/无效值,我是否可以假设SnakeYAML将抛出异常?再次感谢!是的,您将得到一个异常,如在class:Widget上找不到属性'cheese'