java - 创建自定义 Jackson 注释

标签 java annotations marshalling jackson

一个项目需要大量使用Jackson注解的如下组合。那么,有没有办法创建另一个注释来避免丑陋的复制/粘贴:

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

最佳答案

使用@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");
    }
}

关于java - 创建自定义 Jackson 注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12921812/

相关文章:

java - Jmagick错误: magick. MagickException:没有可缩放的图像

java - 保持 Java 程序永远运行或长时间运行的最佳方法是什么?

junit - 如何仅对具有自定义注释的测试运行junit?

java - 通过反射找到单元测试中的参数化方法

go - 使用预先构建的字符串作为 bson.M 在 go 中进行 mgo 查询

java - 运行时异常没有编译错误。为什么?

java - 如何填充格式化字符串

Android:android 编译时验证意向附加已通过

c# - 将指向对象的非托管 C++ 指针转换为托管 C# 对象

java - 使用 JAXB 编码 Activity 对象?