Groovy 举例说明

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

我正在尝试使用读取和解析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 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'