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);
}
}
Jeśli twoje zajęcia są niezmienne, jak Jackson ma je zaludnić? – skaffman
wzór konstruktora – duffymo
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. –