Create a custom Jackson annotation

annotations, jackson, java, marshalling

Solution

The use of `@JacksonAnnotationsInside` solve the problem:

public class JacksonTest {

    @Retention(RetentionPolicy.RUNTIME)
    @JacksonAnnotationsInside
    @JsonProperty("_id")
    @JsonSerialize(using=IdSerializer.class, include=Inclusion.NON_NULL)
    @JsonDeserialize(using=IdDeserializer.class)
    public @interface Id {
    }

    public static class Answer {
        @Id
        String id;
        String name;

        public Answer() {}
    }

    @Test
    public void testInside() throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        VisibilityChecker<?> checker = mapper.getSerializationConfig().getDefaultVisibilityChecker();
        mapper.setVisibilityChecker(checker.withFieldVisibility(JsonAutoDetect.Visibility.ANY));

        String string = "{ 'name' : 'John' , '_id' : { 'sub' : '47cc'}}".replace('\'', '"');
        Answer answer = mapper.reader(Answer.class).readValue(string);
        Assertions.assertThat(answer.id).isEqualTo("47cc");
    }
}

Problem

A project needs to use the following combinaison of Jackson annotations together a lot. So, is there a way to create another annotation to avoid ugly copy/paste: ``` public class A { @JsonProperty("_id") @JsonSerialize(using=IdSerializer.class) @JsonDeserialize(using=IdDeserializer.class) String id; } public class B { @JsonProperty("_id") @JsonSerialize(using=IdSerializer.class) @JsonDeserialize(using=IdDeserializer.class) String id; } public class C { @CustomId // don't repeat that configuration endlessly String id; } ``` Update: I've tried this, without success :-( ``` @Retention(RetentionPolicy.RUNTIME) @JacksonAnnotationsInside @JsonProperty("_id") @JsonSerialize(using=IdSerializer.class, include=JsonSerialize.Inclusion.NON_NULL) @JsonDeserialize(using=IdDeserializer.class) public @interface Id {} public class D { @Id private String id; } ```

Original source