在Groovy中读取YAML文件

在Groovy中读取YAML文件,groovy,yaml,betamax,Groovy,Yaml,Betamax,我试图在Groovy项目中加载现有的YAML文件(使用snakeYaml库)。我有一个名为YamlTape.groovy的类,其中包含使用以下代码加载YAML文件的方法 static YamlTape readFrom(Reader reader) { try { println "YamlTape : inside readFrom reader.size() = "+reader+" YamlTape: "+YamlTape yaml.loadAs(

我试图在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类调用此方法

代码:

但是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

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,@Warrior实际上,您在
readFrom
方法中也在这样做……请参阅editWe使用betamax在yaml文件中记录restful服务。我能够记录它,但当尝试重新加载yaml文件时,它崩溃了。
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)
  }
}