Модуль Jackson LocalDate зарегистрирован по-прежнему исключение - PullRequest
0 голосов
/ 04 декабря 2018

Я хотел сериализовать список с различными объектами класса Person с firstname, lastname и birthday.Посмотрев различные вопросы на форуме, я обнаружил, что мне нужно зарегистрировать jsr.310.JavaTimeModule для сериализации LocalDate birthday.Я знаю, что на этом сайте есть много записей по этой теме, но большинство из них говорят, что регистрации модуля достаточно для обработки LocalDate.

Это мой класс писателя:

public void write(){
    ArrayList<Person> personList = new ArrayList<>();

    Person p1 = new Person("Peter", "Griffin", LocalDate.of(1988,6,5));
    Person p2 = new Person("Lois", "Griffin", LocalDate.of(1997,9,22));

    personList.add(p1);
    personList.add(p2);

    ObjectMapper mapper = new ObjectMapper().registerModule(new JavaTimeModule());
    ObjectWriter writer = mapper.writer(new DefaultPrettyPrinter());

    try {
        writer.writeValue(new File(System.getProperty("user.dir")+"/File/Personen.json"), personList);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

, а мой класс Reader:

 public void read(){
    ObjectMapper mapper = new ObjectMapper();

    try {
        ArrayList<Person> liste = mapper.readValue(new FileInputStream("File/Personen.json"),
                mapper.getTypeFactory().constructCollectionType(ArrayList.class, Person.class));
        System.out.println(liste.get(0).getFirstname());
    } catch (IOException e) {
        e.printStackTrace();
    }
}

После прочтения файла я получаю

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Невозможно создать экземпляр java.time.LocalDate (не существует создателей, таких как конструкция по умолчанию): нет конструктора аргумента-строки / метода фабрики для десериализации из значения String ('1988-06-05 ')
в [Источник: (FileInputStream);строка: 4, столбец: 18] (через цепочку ссылок: java.util.ArrayList [0] -> Person ["birthday"])

Я думал, что мне больше ничего не нужно делатьчем регистрация TimeModule.Нужно ли регистрировать модуль для ридера?Или есть другая проблема с моим кодом?

1 Ответ

0 голосов
/ 05 декабря 2018

Вы правильно зарегистрировали JavaTimeModule с помощью ObjectMapper в своем методе write().

ObjectMapper mapper = new ObjectMapper().registerModule(new JavaTimeModule());

Но вы забыли зарегистрировать его с помощью ObjectMapper в своем методе read().

ObjectMapper mapper = new ObjectMapper();

Чтобы исправить это, просто добавьте туда отсутствующий .registerModule(new JavaTimeModule()).

Или еще лучше:
Удалите локальные определения ObjectMapper из ваших write и readметоды.Вместо этого добавьте его как переменную-член в ваш класс, чтобы вы могли использовать один и тот же экземпляр ObjectMapper в обоих методах.

private ObjectMapper mapper = new ObjectMapper().registerModule(new JavaTimeModule());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...