2012-06-07 12 views
6

Eksperymentowałem z miksami Jackson 2.0, aby przekształcić klasę w klasę bez adnotacji.Nie można uzyskać podstawowego zestawu Jackson Mixin do pracy

Uproszczony kod źródłowy poniżej. Zauważ, że nie używam getters/setters, ale wydawało mi się, że nadal mogę używać 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); 
    } 
} 

Kiedy uruchomić główny uzyskać

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) 

Zgaduję, że wyjeżdżam podstawową „setThis” krok gdzieś, ale nie wiem co. Dzięki!

EDIT: Kiedy postępuj zgodnie z instrukcjami w wyjątku i dodać linię

objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); 

już nie uzyskać wyjątek, ale wynik jest pustym JSON String „{}”.

EDIT2: Jeśli upubliczę pola, to działa, ale nie jest to rozsądny projekt obiektu.

Odpowiedz

5

Wymyśliłem to. Jeśli chcesz uzyskać dostęp do pól prywatnych, trzeba grać z Widzialność dodając następujący wiersz:

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

dla pól chronionych, można również użyć Visibility.PROTECTED_AND_PUBLIC

6

Jeśli chcesz użyć kombinacji adnotacji w poprawny sposób jest to zadeklarować.

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

w ten sposób można kontrolować pola do serializacji prostu włączając/wyłączając je z mieszanki w

Powiązane problemy