Jackson 1.9 и объекты конфигурации без сохранения состояния (свободный интерфейс) - PullRequest
0 голосов
/ 04 ноября 2011

Раньше я делал это (в setupContext в подклассе SimpleModule):

DeserializationConfig dc = context.getDeserializationConfig();
dc.disable(Feature.CAN_OVERRIDE_ACCESS_MODIFIERS);
dc.disable(Feature.READ_ENUMS_USING_TO_STRING);
dc.disable(Feature.FAIL_ON_UNKNOWN_PROPERTIES);

Но получаю предупреждения об устаревании в 1.9, поэтому я пытаюсь:

DeserializationConfig dc = context.getDeserializationConfig();
dc.without(Feature.CAN_OVERRIDE_ACCESS_MODIFIERS)
  .without(Feature.READ_ENUMS_USING_TO_STRING)
  .without(Feature.FAIL_ON_UNKNOWN_PROPERTIES);

, но это кажетсяне имеет никакого эффекта, так как после этих вызовов

dc = context.getDeserializationConfig();
System.out.println(dc.isEnabled(Feature.CAN_OVERRIDE_ACCESS_MODIFIERS));
System.out.println(dc.isEnabled(Feature.READ_ENUMS_USING_TO_STRING));
System.out.println(dc.isEnabled(Feature.FAIL_ON_UNKNOWN_PROPERTIES));

печатает

true
false
true

, которые кажутся значениями по умолчанию.Что мне здесь не хватает?

1 Ответ

1 голос
/ 04 ноября 2011

Эти методы создают новые экземпляры, поэтому вы ДОЛЖНЫ назначать их. Они были добавлены, чтобы получить немного более функциональный стиль, пытаясь сделать большинство объектов неизменяемыми, что, в свою очередь, очень помогает с параллелизмом (в основном может делиться экземплярами без синхронизации). Соглашение об именах пытается прояснить это: set - методы меняют состояние, при этом методы xxx () являются «текущими фабриками».

что некоторые фреймворки используют плавные методы исключительно для объединения в цепочку, но в большинстве случаев они предназначены для объектов Builder (изменяемые), и в результате получающиеся неизменные объекты не имеют методов для изменения состояния; но могут быть методы для создания новых строителей. Джексон в большинстве случаев использует методы withXxx (), без компоновщиков (в некоторых случаях используются полные компоновщики, но их меньшинство).

Как вы правильно заметили, проблема 686 связана с конкретным случаем изменения функций через интерфейс модуля. Это неблагоприятный побочный эффект других изменений и должен быть адрес для следующего выпуска. Но до тех пор, пока вам не понадобится изменить функции напрямую через ObjectMapper (setDeserializationConfig (...), или настроить (...), или использовать устаревшие методы, если вы должны использовать интерфейс модуля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...