J'utilise Jackson 1.6.4 et Java JDK 6.Est-ce que Jackson sans annotations exige absolument des setters?
Je ne veux pas utiliser les annotations Jackson; Je veux avoir des objets Java immuables sans setters.
Les deux exigences semblent entrer en conflit.
Si j'ajoute des décodeurs privés, la désérialisation fonctionne correctement. J'essaie de ne pas recourir à des setters privés pour mes objets immuables - je suis têtu de cette façon.
Je suis en train d'essayer une implémentation personnalisée de VisibilityChecker pour autoriser tout accès aux champs.
Mais si quelqu'un a des conseils ou des leçons apprises qu'ils peuvent partager, j'aimerais les entendre.
MISE À JOUR: Cela fonctionne.
Motif constructeur, constructeur privé - à la Bloch "Effective Java".
Il a fallu configurer la configuration de désérialisation et la visibilité, mais maintenant c'est bon à faire.
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);
}
}
Si vos classes sont immuables, comment Jackson est-il supposé les peupler? – skaffman
motif de constructeur – duffymo
Si vous avez résolu votre problème, postez votre solution comme réponse ci-dessous, afin que votre question ne semble pas sans réponse. –