2016-10-17 3 views
2

Ich möchte nur Felder in meine Klassen aufnehmen, die meine benutzerdefinierte Annotation @MyInclude haben, aber Jackson endet damit, alles zu ignorieren. Was mache ich falsch?Fügen Sie Felder mit benutzerdefinierten Annotationen mit JacksonAnnotationIntrospector.hasIgnoreMarker() hinzu.

public static void main(String[] args) throws Exception { 
    ObjectMapper mapper = new ObjectMapper(); 
    mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); 
    mapper.setAnnotationIntrospector(new IgnoreIntrospector()); 

    MyNestedObject nestedObject = new MyNestedObject("value1", "value2"); 

    MyObject object = new MyObject(); 
    object.setNestedObject(nestedObject); 

    String json = mapper.writeValueAsString(object); //This returns {} 
    } 

    public static class IgnoreIntrospector extends JacksonAnnotationIntrospector { 
    private static final long serialVersionUID = -3951086067314107368L; 

    @Override 
    public boolean hasIgnoreMarker(AnnotatedMember m) { 
     return !m.hasAnnotation(MyInclude.class) || super.hasIgnoreMarker(m); 
    } 
    } 


import lombok.AllArgsConstructor; 
import lombok.Data; 
import lombok.NoArgsConstructor; 

@Data 
@NoArgsConstructor 
@AllArgsConstructor 
public class MyObject { 
    @MyInclude 
    private MyNestedObject nestedObject; 
} 

import lombok.AllArgsConstructor; 
import lombok.Data; 
import lombok.NoArgsConstructor; 

@Data 
@NoArgsConstructor 
@AllArgsConstructor 
public class MyNestedObject { 
    @MyInclude 
    private String value1; 
    private String value2; 
} 

mapper.writeValueAsString(object) kehrt {} aber es sollte NestedObject mit Wert1 zurückkehren statt bevölkert (Wert2 ignoriert).

Wenn ich meine IgnoreIntrospector.hasIgnoreMarker() auf nur super.hasIgnoreMarker(m) aktualisiere, dann wäre alles in der JSON-Zeichenfolge enthalten.

Antwort

0

Die IgnoreIntrospector allein war nicht genug. Da meine benutzerdefinierte Anmerkungen auf den Feldern nur waren, brauchte ich alle Sichtbarkeit zu deaktivieren:

mapper.setAnnotationIntrospector(new IgnoreIntrospector()); 

mapper.setVisibility(mapper.getSerializationConfig().getDefaultVisibilityChecker() 
.withFieldVisibility(JsonAutoDetect.Visibility.ANY) 
.withGetterVisibility(JsonAutoDetect.Visibility.NONE) 
.withSetterVisibility(JsonAutoDetect.Visibility.NONE) 
.withCreatorVisibility(JsonAutoDetect.Visibility.NONE)); 

mapper.setVisibility(mapper.getDeserializationConfig().getDefaultVisibilityChecker() 
.withFieldVisibility(JsonAutoDetect.Visibility.ANY) 
.withGetterVisibility(JsonAutoDetect.Visibility.NONE) 
.withSetterVisibility(JsonAutoDetect.Visibility.NONE) 
.withCreatorVisibility(JsonAutoDetect.Visibility.NONE)); 

und aktualisiert mein IgnoreIntrospector:

public static class IgnoreIntrospector extends JacksonAnnotationIntrospector { 

    @Override 
    public boolean hasIgnoreMarker(AnnotatedMember m) { 
     return m instanceof AnnotatedField && _findAnnotation(m, MyInclude.class) == null; 
    } 
    } 
Verwandte Themen