2016-10-17 2 views
2

사용자 정의 주석 @MyInclude이있는 클래스에만 필드를 포함하고 싶지만 Jackson은 모든 것을 무시합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?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){}를 반환하지만 (값 2 무시) 대신 채워 값 1로 NestedObject를 반환해야합니다.

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