3

Groovy プロジェクトに既存の YAML ファイル (snakeYaml ライブラリを使用) をロードしようとしています。次のコードを使用して YAML ファイルをロードするメソッドを含む YamlTape.groovy というクラスがあります。

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)
    }
}

別のグルーヴィーなクラスからこのメソッドを呼び出そうとしています。

コード:

    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)
    }
}

しかし、ロード テープ メソッドのテープ変数は常に 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
4

1 に答える 1

2

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)
  }
}
于 2013-08-19T10:14:58.387 に答える