Создайте пользовательскую аннотацию Джексона
В проекте необходимо много использовать комбинацию из комментариев Джексона. Итак, есть ли способ создать еще одну аннотацию, чтобы избежать уродливой копии/вставки:
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;
}
Обновление: Я пробовал это без успеха: - (
@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;
}
Ответы
Ответ 1
Использование @JacksonAnnotationsInside
разрешает проблему:
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");
}
}
Ответ 2
Я бы предположил, что вы можете написать свои собственные классы аннотаций
package org.codehaus.jackson.annotate ;
public @ interface JsonProperty
{
String value ( ) default "_id" ;
}
public @ interface JsonSerialize
{
Class using ( ) default IdSerializer.class ;
}
...
Скомпилируйте эти классы и убедитесь, что они находятся в вашем пути к классам перед исходными версиями. Это уменьшает, но не исключает копирование/вставку.
Затем ваш образец кода станет
public class A {
@JsonProperty
@JsonSerialize
@JsonDeserialize
String id;
}
public class B {
@JsonProperty
@JsonSerialize
@JsonDeserialize
String id;
}
Я понимаю, что это не то, что вы хотели, но это начало.