简体   繁体   中英

Ignore properties marked with specific annotation

I have ObjectMapper instance:

ObjectMapper mapper = new ObjectMapper();

In runtime want to serialize instance of class. What is the class the program doesn't known. It's object instance of parameterized type T.

How to ignore all properties (fields and getters) which marked specified annotation (javax.persistence.Id)?

Example:

public static class PojoTest {
   @Id
   public String idTest;
   public String id;
}
    
public void serialize(Object object) {
   ObjectMapper objectMapper = new ObjectMapper();
   // TODO ignore property mark @Id annotation
   Map<Object, Object> map = objectMapper.convertValue(object, Map.class);
   assertFalse(map.containsKey("idTest"));
}

public void test() {
  PojoTest pojoTest = new PojoTest();
  pojoTest.id = "foo";
  pojoTest.idTest = "bar";
  serialize(pojoTest);
}

You can implement a new com.fasterxml.jackson.databind.AnnotationIntrospector class where you can extend hasIgnoreMarker method:

static class IdIgnoreAnnotationIntrospector extends AnnotationIntrospector {
    @Override
    public Version version() {
        return new Version(1,0,0,"Ignore @Id", "group.id", "artifact.id");
    }

    @Override
    public boolean hasIgnoreMarker(AnnotatedMember m) {
        return hasIdAnnotation(m);
    }

    boolean hasIdAnnotation(AnnotatedMember member) {
        return member.getAnnotation(Id.class) != null;
    }
}

Now you need to register this introspector:

ObjectMapper mapper = new ObjectMapper();
mapper.setAnnotationIntrospector(AnnotationIntrospector.pair(new JacksonAnnotationIntrospector(), new IdIgnoreAnnotationIntrospector()));

Now you can ignore all fields marked with @Id annotation.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM