2011-01-27 14 views
16

Używam Jackson 1.6.4 i Java JDK 6.Czy Jackson bez adnotacji absolutnie wymaga seterów?

Nie chcę używać adnotacji Jacksona; Chcę mieć niezmienne obiekty Java bez ustawiaczy.

Dwa wymagania wydają się być sprzeczne.

Jeśli dodam deserializację prywatnych ustawiaczy działa dobrze.

Próbuję nie uciekać się do prywatnych seterów dla moich niezmiennych obiektów - jestem uparta w ten sposób.

Jestem w trakcie próby niestandardowej implementacji VisibilityChecker, aby umożliwić dostęp do dowolnego pola.

Ale jeśli ktoś ma jakieś rady lub lekcje, które mogą się z nim podzielić, to będę wdzięczny za ich wysłuchanie.

AKTUALIZACJA: Działa.

Wzór konstruktora, prywatny konstruktor - a la Bloch "Efektywna Java".

Zajęło ustawienie konfiguracji i widoczności deserializacji, ale teraz dobrze jest przejść.

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

Jeśli twoje zajęcia są niezmienne, jak Jackson ma je zaludnić? – skaffman

+0

wzór konstruktora – duffymo

+6

jeśli rozwiązałeś swój problem, prześlij swoje rozwiązanie jako odpowiedź poniżej, aby Twoje pytanie nie pojawiło się bez odpowiedzi. –

Odpowiedz

17

Miło słyszeć, że robione to działa - możliwość zmiany poziomu widoczności Automatyczne wykrywanie jest bardzo potężnym narzędziem, ale istnieje tak wiele funkcji, że nie jest trywialne, aby znaleźć wszystko.

Kilka dodatkowych wskaźników: jeśli nie chcesz dodawać adnotacji Jacksona w POJO, nadal możesz użyć mix-in annotations. Dzięki temu możesz użyć @JsonCreator, aby określić inny niż domyślny konstruktor, który pozwala na stosowanie prawdziwych niezmiennych typów wartości (więcej o Jackson i niezmiennych typach na this article).

I na koniec: podczas gdy wzorzec konstruktora nie jest jeszcze bezpośrednio wspierany, został zaplanowany zgodnie z this Jira entry.

+0

Nie chcę żadnych adnotacji, ponieważ nie chcę budować zależności od Jacksona w moim modelu domeny. Udało mi się to poprzez przeniesienie serializacji do osobnego interfejsu Mapper z implementacjami zarówno dla Jacksona, jak i XML. – duffymo

+0

Nie spowoduje to dodania zależności do modelu domeny, ponieważ zależność jest od dodatkowych typów mieszania do modelu domeny. I trzeba to zrobić tylko w konkretnych przypadkach, w których potrzebne są przesłonięcia. Rozumiem chęć uniknięcia uzależnienia od typów ogólnych do typowych dla serializacji; była to główna motywacja do implementacji systemu adnotacji typu mix-in. – StaxMan

Powiązane problemy