Прочитать файл YAML в Groovy
Я пытаюсь загрузить существующий файл YAML (который использует библиотеку snakeYaml) в моем проекте Groovy. У меня есть класс с именем 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)
}
}
и пытается вызвать этот метод из другого классного класса.
Код:
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)
}
}
Но переменная ленты в методе загрузки ленты всегда возвращает ноль. Я добавил несколько журналов и обнаружил, что код может получить доступ к файлу 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
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)
}
}