2011-01-27 7 views
16

Sto usando Jackson 1.6.4 e Java JDK 6.Jackson, senza annotazioni, ha assolutamente bisogno di seder?

Non voglio usare le annotazioni di Jackson; Voglio avere oggetti Java immutabili senza setter.

I due requisiti sembrano essere in conflitto.

Se aggiungo la deserializzazione dei setter privati, funziona bene.

Sto cercando di non ricorrere ai setter privati ​​per i miei oggetti immutabili - Sono così testardo.

Sono in procinto di provare un'implementazione personalizzata di VisibilityChecker per consentire QUALSIASI accesso al campo.

Ma se qualcuno ha qualche consiglio o lezioni apprese che possono condividere mi piacerebbe ascoltarli.

AGGIORNAMENTO: Funziona.

Modello di costruttore, costruttore privato - a la Bloch "Java efficace".

Ha richiesto la configurazione e la visibilità della deserializzazione, ma ora è tutto a posto.

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

Se le tue lezioni sono immutabili, come si suppone che Jackson le popoli? – skaffman

+0

builder pattern – duffymo

+6

se hai risolto il tuo problema, per favore pubblica la tua soluzione come risposta qui sotto, in modo che la tua domanda non appaia senza risposta. –

risposta

17

Sono contento di sentire che hai fatto il lavoro - la capacità di modificare i livelli di visibilità auto-rilevamento è una caratteristica molto potente, ma ci sono così tante funzioni che non è banale per trovare tutto quello che c'è.

Coppia di puntatori aggiuntivi: se non si desidera aggiungere annotazioni Jackson nei POJO, è comunque possibile utilizzare mix-in annotations. Con questo, è possibile utilizzare @JsonCreator per specificare un costruttore non predefinito da utilizzare che consenta tipi di valore immutabili reali (maggiori dettagli su Jackson e tipi immutabili su this article).

E infine: mentre builder non è ancora supportato direttamente, è stato progettato secondo this Jira entry.

+0

Non voglio alcuna annotazione, perché non voglio costruire la dipendenza da Jackson nel mio modello di dominio. L'ho gestito spostando la serializzazione in un'interfaccia Mapper separata con implementazioni sia per Jackson che per XML. – duffymo

+0

Questo non sarebbe aggiungere la dipendenza nel modello di dominio, come la dipendenza è da altri tipi di modello di dominio mix-in. E deve essere fatto solo per casi specifici in cui sono necessari gli override. Comprendo il desiderio di evitare di dipendere da tipi generali a tipi specifici di serializzazione; questa era la motivazione principale per il sistema di annotazione mix-in di implementazione. – StaxMan

Problemi correlati