Джексон без аннотаций абсолютно требует сеттеров? - PullRequest
17 голосов
/ 28 января 2011

Я использую Jackson 1.6.4 и Java JDK 6.

Я не хочу использовать аннотации Джексона;Я хочу иметь неизменяемые объекты Java без установщиков.

Эти два требования противоречат друг другу.

Если я добавляю частные сеттеры, десериализация работает нормально.

Я пытаюсь не прибегать к частным сеттерам для моих неизменных объектов - я упрям ​​в этом смысле.Я пытаюсь реализовать пользовательскую реализацию VisibilityChecker, чтобы разрешить ЛЮБОЙ доступ к полю.

Но если у кого-то есть какие-то советы или уроки, которыми они могут поделиться, я буду признателен, если вы их услышите.: Он работает.

Шаблон Builder, частный конструктор - а-ля Блох "Эффективная Java".

Потребовались настройки конфигурации десериализации и видимости, но теперь все готово.

public class JsonMapper
{
   private static final int INITIAL_SIZE = 2048;
   /** See http://wiki.fasterxml.com/JacksonBestPracticeThreadSafety?highlight=(\bCategoryJackson\b) */
   private static ObjectMapper mapper;

   static
   {
      mapper = new ObjectMapper();

      mapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false);
      SerializationConfig serializationConfig = mapper.getSerializationConfig();
      serializationConfig.setDateFormat(Person.DEFAULT_FORMATTER);

      mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES,false);
      DeserializationConfig deserializationConfig = mapper.getDeserializationConfig();
      deserializationConfig.setDateFormat(Person.DEFAULT_FORMATTER);
      deserializationConfig.enable(DeserializationConfig.Feature.AUTO_DETECT_FIELDS);
      mapper.setVisibilityChecker(VisibilityChecker.Std.defaultInstance().withFieldVisibility(JsonAutoDetect.Visibility.ANY));
   }

   public static <T> String serialize(T o) throws IOException
   {
      StringWriter sw = new StringWriter(INITIAL_SIZE);
      mapper.writeValue(sw, o);

      return sw.toString();
   }

   public static <T> T deserialize(String source, Class<T> targetClass) throws IOException
   {
      ByteArrayInputStream stream = new ByteArrayInputStream(source.getBytes());
      TreeTraversingParser treeTraversingParser = new TreeTraversingParser(mapper.readTree(stream));
      treeTraversingParser.setCodec(mapper);

      return treeTraversingParser.readValueAs(targetClass);
   }
}

1 Ответ

18 голосов
/ 28 января 2011

Рад слышать, что вы заставили это работать - возможность изменять уровни видимости автоопределения является очень мощной функцией, но есть так много функций, что найти все, что есть, не так просто.

Пара дополнительных указателей: если вы не хотите добавлять аннотации Джексона в POJO, вы все равно можете использовать смешанные аннотации . При этом вы можете использовать @JsonCreator, чтобы указать конструктор не по умолчанию, который позволяет использовать настоящие неизменяемые типы значений (подробнее о Джексоне и неизменяемых типах в в этой статье ).

И наконец: хотя шаблон построителя еще не поддерживается напрямую, он был спланирован согласно этой записи Jira .

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