2016-10-17 4 views
2

Я хочу включать только поля в мои классы, у которых есть пользовательская аннотация @MyInclude, но Джексон заканчивает тем, что игнорирует все. Что я делаю не так?Включить поля с пользовательской аннотацией с помощью JacksonAnnotationIntrospector.hasIgnoreMarker()

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) возвращается {}, но он должен вернуть NestedObject с значению1 заселенной вместо (игнорируя значение2).

Если я обновляю свой IgnoreIntrospector.hasIgnoreMarker() до super.hasIgnoreMarker(m), тогда все будет включено в строку json.

ответ

0

Недостаточно одного только IgnoreIntrospector. Так как мои пользовательские аннотации были только на полях, мне нужно, чтобы отключить все видимости:

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)); 

И обновил мой IgnoreIntrospector:

public static class IgnoreIntrospector extends JacksonAnnotationIntrospector { 

    @Override 
    public boolean hasIgnoreMarker(AnnotatedMember m) { 
     return m instanceof AnnotatedField && _findAnnotation(m, MyInclude.class) == null; 
    } 
    } 
Смежные вопросы