2011-01-27 4 views
16

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); 
    } 
} 
+1

Si vos classes sont immuables, comment Jackson est-il supposé les peupler? – skaffman

+0

motif de constructeur – duffymo

+6

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. –

Répondre

17

Je suis heureux de vous entendre fait le travail - capacité à modifier les niveaux de visibilité de détection automatique est une fonctionnalité très puissante, mais il y a tellement de fonctionnalités qu'il est pas trivial de trouver tout ce qu'il ya.

Couple de pointeurs supplémentaires: si vous ne souhaitez pas ajouter d'annotations Jackson dans les POJO, vous pouvez toujours utiliser mix-in annotations. Avec ceci, vous pouvez utiliser @JsonCreator pour spécifier un constructeur non-par défaut à utiliser qui permette les vrais types de valeurs immuables (plus sur Jackson et les types immuables sur this article).

Et enfin: alors que le modèle de générateur n'est pas encore directement pris en charge, il a été planifié selon this Jira entry.

+0

Je ne veux pas d'annotations, car je ne veux pas construire la dépendance sur Jackson dans mon modèle de domaine. Je l'ai géré en déplaçant la sérialisation dans une interface Mapper distincte avec des implémentations pour Jackson et XML. – duffymo

+0

Cela n'ajouterait pas de dépendance au modèle de domaine, car la dépendance provient de types de mixage supplémentaires au modèle de domaine. Et seulement doit être fait pour des cas spécifiques où des remplacements sont nécessaires. Je comprends le désir d'éviter d'avoir une dépendance des types généraux aux types spécifiques de sérialisation; C'était la principale motivation pour la mise en œuvre du système d'annotation mix-in. – StaxMan

Questions connexes