Лучшие практики для десериализации коллекции Джексона

Допустим, у меня есть простой класс Person

public class Person{
  final List<String> names= Lists.newArrayList();

  public List<String> getNames(){
    return names;
  }
}

Если я попытаюсь десериализовать это с Джексоном (2.2)

Person l = mapper.readValue(js,Person.class);

я получил Disabling Afterburner deserialization ....due to access error (type java.lang.IllegalAccessError ....

Это из-за окончательного спискаимен. Чтобы решить это, я установил MapperFeature.ALLOW_FINAL_FIELDS_AS_MUTATORS в false,

Это правильное решение или лучше просто сделать список не окончательным?

Есть ли метод Джексона для использования методов collection.add для инициализации коллекций?

Или, может быть, есть лучший способ. Что можно предложить здесь?

РЕДАКТИРОВАТЬ: Теперь я нашел эту настройку:

USE_GETTERS_AS_SETTERS (по умолчанию: true) Управляет тем, можно ли использовать "получатели", которые возвращают типы Collection или Map, для "установки" значений (так же, как JAXB API работает с XML), поэтому отдельный метод "setter" не требуется. Даже если этот метод включен, явный метод "setter" будет иметь приоритет над неявным getter-as-setter, если таковой существует.

Похоже, именно то, что я искал, и он включен по умолчанию. Так почему же тогда это проигнорировали?

2 ответа

Работа с неизменяемыми объектами в вашем приложении - это лучшая практика, но на границах с внешним миром (не являющимся Java) вам обычно приходится воздерживаться от их использования.

В большинстве технологий сериализации все работает нормально, когда ваши объекты "хорошо себя ведут" (изменяемые, с геттерами и сеттерами в соответствии со стандартом JavaBeans). Обычно это можно обойти, но по моему опыту проще всего сделать эту чертовую вещь изменчивой, если вы не собираетесь ссылаться на нее из другого Java-кода. (если худшее приходит к худшему, создайте выделенную сериализацию DTO)

Я подозреваю, что это связано с проблемой сочетания вещей. В частности, можете ли вы попробовать свой подход без предварительного включения Afterburner? Если это работает, то это проблема обработки модуля Afterburner - это возможно, поскольку используемый здесь путь к коду отличается от пути по умолчанию. Убедитесь, что вы используете последнюю версию; 2.3.0 был только что выпущен.

Другие вопросы по тегам