Есть ли способ синтаксического анализа (десериализуемый, если хотите), файл ymal для указания объекта c, используя его конструктор, а не сеттеры и геттеры? - PullRequest
0 голосов
/ 08 апреля 2020

Итак, чтобы быть более точным c У меня есть простой файл ymal и класс, с которым мне нужно разобраться, но проблема в том, что мне нужен конструктор (с геттерами и сеттерами все работает нормально, но с конструктором программа вызывает большое количество спама из-за ошибок), поэтому, если кто-нибудь может предложить мне способ решения этой проблемы, я буду очень признателен за это.

File:
    firstName: "John"
    lastName: "Doe"
    age: 31
    contactDetails:
      - type: "mobile"
        number: 123456789
      - type: "landline"
        number: 456786868

Класс (как я уже сказал, класс с конструктором, геттеры без сеттеров)

    public class Customer {
    private String firstName;
    private String lastName;
    private int age;
    private List<Contact> listContact;   

   public Customer(String firstName,String lastName,List<Contact> listContact){
    this.firstName = firstName;
    this.lastName = lastName;
    this.listContact = listContact;
 }
//getters and toString
}

Попытка разбора (я использую библиотеку SnakeYAML)

Yaml yaml = new Yaml(new Constructor(Customer.class));
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(fileName);
Customer customer = yaml.load(inputStream);

И ошибка

Exception in thread "main" Can't construct a java object for tag:yaml.org,2002:zad1.Customer; exception=java.lang.InstantiationException: NoSuchMethodException:zad1.Customer.<init>()
 in 'reader', line 1, column 1:
    firstName: "John"
    ^

    at org.yaml.snakeyaml.constructor.Constructor$ConstructYamlObject.construct(Constructor.java:336)
    at org.yaml.snakeyaml.constructor.BaseConstructor.constructObjectNoCheck(BaseConstructor.java:230)
    at org.yaml.snakeyaml.constructor.BaseConstructor.constructObject(BaseConstructor.java:219)
    at org.yaml.snakeyaml.constructor.BaseConstructor.constructDocument(BaseConstructor.java:173)
    at org.yaml.snakeyaml.constructor.BaseConstructor.getSingleData(BaseConstructor.java:157)
    at org.yaml.snakeyaml.Yaml.loadFromReader(Yaml.java:472)
    at org.yaml.snakeyaml.Yaml.loadAs(Yaml.java:466)
    at zad1.Tools.createOptionsFromYaml(Tools.java:18)
    at zad1.Main.main(Main.java:14)
Caused by: org.yaml.snakeyaml.error.YAMLException: java.lang.InstantiationException: NoSuchMethodException:zad1.Customer.<init>()
    at org.yaml.snakeyaml.constructor.BaseConstructor.newInstance(BaseConstructor.java:303)
    at org.yaml.snakeyaml.constructor.Constructor$ConstructMapping.construct(Constructor.java:167)
    at org.yaml.snakeyaml.constructor.Constructor$ConstructYamlObject.construct(Constructor.java:331)
    ... 8 more
Caused by: java.lang.InstantiationException: NoSuchMethodException:zad1.Customer.<init>()
    at org.yaml.snakeyaml.constructor.BaseConstructor.newInstance(BaseConstructor.java:333)
    at org.yaml.snakeyaml.constructor.BaseConstructor.newInstance(BaseConstructor.java:308)
    at org.yaml.snakeyaml.constructor.BaseConstructor.newInstance(BaseConstructor.java:301)
    ... 10 more
...