2012-06-07 23 views
6

Estaba experimentando con mezclas de Jackson 2.0 para serializar una clase sin anotaciones.No se puede obtener un Jackson Mixin básico para funcionar

Simplificado Código fuente a continuación. Tenga en cuenta que no estoy usando getters/setters, pero parece que todavía puedo usar 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); 
    } 
} 

Cuando corro principal me sale

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) 

supongo que estoy dejando a cabo un "setThis" básicas paso en alguna parte, pero no sé qué. ¡Gracias!

EDIT: Cuando sigo las instrucciones de la Excepción y añadir una línea

objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); 

ya no recibo una excepción, pero el resultado es un vacío JSON cadena, "{}".

EDIT2: Si hago públicos los campos, funciona, pero no es un diseño de objeto razonable.

Respuesta

5

Me di cuenta. Si desea acceder a los campos privados, es necesario jugar con la Visibilidad añadiendo la siguiente línea:

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

Para campos protegidos, también se puede utilizar Visibility.PROTECTED_AND_PUBLIC

6

Si desea utilizar la mezcla de anotación en el forma correcta de declarar que es:.

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

de esta manera se pueden controlar los campos para serializar simplemente inclusión/exclusión de ellos de la mezcla en

Cuestiones relacionadas