2011-01-27 7 views
16

Я использую Jackson 1.6.4 и Java JDK 6.Разве Джексон без аннотаций абсолютно необходим сеттерам?

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

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

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

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

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

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

ОБНОВЛЕНИЕ: Он работает.

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); 
    } 
} 
+1

Если ваши классы неизменны, как Джексон должен их заполнять? – skaffman

+0

строительный шаблон – duffymo

+6

, если вы решили свою проблему, отправьте свое решение в качестве ответа ниже, чтобы ваш вопрос не остался без ответа. –

ответ

17

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

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

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

+0

Мне не нужны аннотации, потому что я не хочу строить зависимость от Джексона в моей модели домена. Я справился с этим, переместив сериализацию в отдельный интерфейс Mapper с реализациями как для Jackson, так и для XML. – duffymo

+0

Это не добавит зависимости в модель домена, так как зависимость от дополнительных типов подключений к модели домена. И нужно делать только в определенных случаях, когда необходимы переопределения. Я понимаю стремление избежать зависимости от общих типов до типов сериализации; это была основная мотивация внедрения системы аннотаций. – StaxMan

 Смежные вопросы

  • Нет связанных вопросов^_^