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);
}
}
Se le tue lezioni sono immutabili, come si suppone che Jackson le popoli? – skaffman
builder pattern – duffymo
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. –