2012-06-07 5 views
6

J'expérimentais avec des mixins Jackson 2.0 pour sérialiser une classe sans annotations.Impossible de faire fonctionner un Jackson Mixin de base

Code source simplifié ci-dessous. Notez que je n'utilise pas les getters/setters, mais il me semble que je peux toujours utiliser les mixins according to some fairly sketchy documentation.

public class NoAnnotation { 
    private Date created; 
    private String name; 
    private int id; 
    private List<URL> urls = new ArrayList(); 

    // make one with some data in it for the test 
    static NoAnnotation make() { 
     NoAnnotation na= new NoAnnotation(); 
     na.created = new Date(); 
     na.name = "FooBear"; 
     na.id = 23456; 

     try { 
     na.urls.add(new URL("http://www.eclipse.org/eclipselink/moxy.php")); 
     na.urls.add(new URL("http://jaxb.java.net")); 
     } catch (MalformedURLException e) { 
     throw new RuntimeException(e); 
     } 
     return na; 
    } 

    // my Mixin "Class" 
    static class JacksonMixIn { 
     JacksonMixIn(@JsonProperty("created") Date created, 
        @JsonProperty("name") String name, 
        @JsonProperty("id") int id, 
        @JsonProperty("urls") List<URL> urls) 
     { /* do nothing */ } 
    } 

    // test code 
    public static void main(String[] args) throws Exception { 
     NoAnnotation na = NoAnnotation.make(); 
     ObjectMapper objectMapper = new ObjectMapper(); 
     objectMapper.addMixInAnnotations(NoAnnotation.class, JacksonMixIn.class); 
     String jsonText = objectMapper.writeValueAsString(na); 
     System.out.println(jsonText); 
    } 
} 

Quand je lance principale je reçois

Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class com.flyingspaniel.so.NoAnnotation and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.SerializationFeature.FAIL_ON_EMPTY_BEANS)) 
    at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.failForEmpty(UnknownSerializer.java:51) 
    at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.serialize(UnknownSerializer.java:25) 
    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:108) 
    at com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:2407) 
    at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:1983) 
    at com.flyingspaniel.so.NoAnnotation.main(NoAnnotation.java:49) 

Je devine que je quitte à un endroit étape « setThis » de base, mais ne savent pas quoi. Merci!

EDIT: Quand je suivez les instructions de l'exception et ajouter une ligne

objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); 

Je reçois plus une exception, mais le résultat est un vide JSON String, "{}".

EDIT2: Si je rends les champs publics, cela fonctionne, mais ce n'est pas une conception d'objet raisonnable.

Répondre

5

Je l'ai compris. Si vous voulez accéder aux champs privés, vous devez jouer avec la visibilité en ajoutant la ligne suivante:

objectMapper.setVisibilityChecker(VisibilityChecker.Std.defaultInstance().withFieldVisibility(Visibility.ANY)); 

Pour les champs protégés, vous pouvez également utiliser Visibility.PROTECTED_AND_PUBLIC

6

Si vous voulez utiliser le mélange d'annotation dans le manière correcte de le déclarer est:.

static class JacksonMixIn { 
    @JsonProperty Date created; 
    @JsonProperty String name; 
    @JsonProperty int id; 
    @JsonProperty List<URL> urls; 
} 

de cette façon vous pouvez contrôler les champs de sérialisation simplement y compris/les exclure du mélange dans

Questions connexes