2016-10-17 3 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){}を返すが、それは(VALUE2を無視する)代わりに移入値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; 
    } 
    } 
関連する問題