Подтвердить что ты не робот

Разве Джексон без аннотаций абсолютно необходим сеттерам?

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

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

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

Если я добавлю десериализацию частных установок, то прекратите работу.

Я пытаюсь не прибегать к частным сеттерам для своих неизменных объектов - я упрям ​​таким образом.

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

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

UPDATE: он работает.

Рисунок Builder, частный конструктор - a la Bloch "Эффективная 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);
   }
}
4b9b3361

Ответ 1

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

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

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