Как я могу загрузить свой файл YAML в класс case? - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть приложение Scala, которое нужно прочитать в файле Yaml и загрузить в класс дел Scala.Я использую snakeyaml для выполнения этой работы, но кажется, что функция load не может использовать конструктор моего case-класса.Ниже приведен пример того, что я делаю:

Файл Yaml:

name: "Jon"
age: 50
gender: "male"

Класс дела:

final case class Person(
    name: String, 
    age: Int,
    gender: String
)

Код для извлечения и загрузки YAML:

val text: String = scala.io.Source.fromFile(file).mkString
val yaml = new Yaml(new Constructor(implicitly[ClassTag[T]].runtimeClass))
yaml.load(text).asInstanceOf[T]

Я получаю следующую ошибку:

 org.yaml.snakeyaml.constructor.ConstructorException: Can't construct a java object for tag:yaml.org,2002:case_classes.Person; exception=java.lang.InstantiationException: NoSuchMethodException:case_classes.Person.<init>()

Что я могу сделать, чтобы избавиться от ошибки?

1 Ответ

0 голосов
/ 19 сентября 2018

Очевидно, что ошибка в том, что Snakeyaml пытается вызвать конструктор no-args и затем установить все свойства с помощью установщиков.

Это никогда не будет работать с Scala case class, поскольку у них нет аргументов no-argsконструктор и сеттеры. Источник .

В качестве обходного пути вы можете использовать circe-yaml .

...