【问题标题】:Read a YAML file in Groovy在 Groovy 中读取 YAML 文件
【发布时间】:2013-08-19 10:10:57
【问题描述】:

我正在尝试在我的 Groovy 项目中加载现有的 YAML 文件(它使用 snakeYaml 库)。我有一个名为 YamlTape.groovy 的类,其中包含使用以下代码加载 YAML 文件的方法。

static YamlTape readFrom(Reader reader) {
    try {
        println "YamlTape : inside readFrom reader.size() = "+reader+" YamlTape: "+YamlTape

        yaml.loadAs(reader, YamlTape)
        println "YamlTape : after readfrom"
    } catch (YAMLException e) {
        println "YamlTape : inside catch block"
        throw new TapeLoadException('Invalid tape', e)
    }
}

并尝试从另一个 groovy 类调用此方法。

代码:

    YamlTape loadTape(String name) {
    println "YamlTapeLoader : inside loadTape"
    def file = fileFor(name)
    println "YamlTapeLoader : inside loadTape filename -name: "+name
    println "YamlTapeLoader : inside loadTape filename -file: "+file

    file.setReadable(true);
    file.setWritable(true);

    if (file.isFile()) {
        println "YamlTapeLoader : inside file.isFile() : "+file.isFile()
        def tape = file.withReader(FILE_CHARSET) { reader ->
            YamlTape.readFrom(reader)

            println "YamlTapeLoader : inside readFrom : "+reader
        }
        println "YamlTapeLoader : tape : "+tape


        tape
    } else {
        println "YamlTapeLoader : inside ELSE : "
        new YamlTape(name: name)
    }
}

但是 load tape 方法中的 tape 变量总是返回 null。我添加了一些日志,发现代码能够访问 yaml 文件但无法解析 Yaml 文档并作为 Java 对象返回。

日志是:

YamlTapeLoader : inside loadTape
YamlTapeLoader : inside loadTape filename -name: kar
YamlTapeLoader : inside loadTape filename -file: /Users/Shared/AATest/Record/kar.yaml
YamlTapeLoader : inside file.isFile() : true
YamlTape : inside readFrom reader.size() = java.io.LineNumberReader@34189cab YamlTape: class co.freeside.betamax.tape.yaml.YamlTape
YamlTape : inside getYaml 
YamlTape : representer = co.freeside.betamax.tape.yaml.TapeRepresenter@201a503f
YamlTape : constructor = org.yaml.snakeyaml.constructor.Constructor@16e7eec9
YamlTape : dumperOption = org.yaml.snakeyaml.DumperOptions@39d7af3
YamlTape : after readfrom
YamlTapeLoader : inside readFrom : java.io.LineNumberReader@34189cab
YamlTapeLoader : tape : null

【问题讨论】:

    标签: groovy yaml betamax


    【解决方案1】:

    withReader 块隐式返回闭包的最后一行,在您的情况下是:

            println "YamlTapeLoader : inside readFrom : "+reader
    

    println返回null,所以把代码改成:

        def tape = file.withReader(FILE_CHARSET) { reader ->
            def ret = YamlTape.readFrom(reader)
            println "YamlTapeLoader : inside readFrom : "+reader
            ret // Return the result of YamlTape.readFrom
        }
    

    它应该可以工作

    编辑

    你的readFrom 方法也有同样的错误...改成:

    static YamlTape readFrom(Reader reader) {
      try {
        println "YamlTape : inside readFrom reader.size() = "+reader+" YamlTape: "+YamlTape
    
        def ret = Yaml.loadAs(reader, YamlTape)
        println "YamlTape : after readfrom"
    
        ret // Return the YamlTape
      } catch (YAMLException e) {
        println "YamlTape : inside catch block"
        throw new TapeLoadException('Invalid tape', e)
      }
    }
    

    【讨论】:

    • def 磁带仍然返回 null。实际上,我正在尝试在我的 groovy 项目中使用snakeYaml 加载现有的 .yaml 文件。我有一个名为 YamlTape.groovy 的类,其中包含加载 Yaml 文件的方法
    • 您实际上是在使用 betamax,还是只是将其用作加载 yaml 的横向方式?如果你只是想加载 yaml,you don't need to import the whole of betamax
    • @Warrior 实际上,你在你的 readFrom 方法中做同样的事情......见编辑
    • 我们正在使用 betamax 将 restful 服务记录在 yaml 文件中。我可以记录它,但是当尝试重新加载 yaml 文件时它崩溃了。
    猜你喜欢
    • 2015-12-30
    • 1970-01-01
    • 2022-08-02
    • 2019-01-09
    • 2017-08-25
    • 2017-06-03
    • 2019-01-24
    • 2020-11-09
    • 1970-01-01
    相关资源
    最近更新 更多