【问题标题】:jackson custom serializer with custom annotated model objects带有自定义注释模型对象的杰克逊自定义序列化程序
【发布时间】:2015-07-24 08:28:48
【问题描述】:

我想在 Jackson Serializer 中处理自定义注释。用例是在来自两个不同数据源的数据之间进行一致性检查,并且有可能忽略某些字段。我可以使用@JsonIgnore,但是当我进行标准 bean 序列化时我需要这些字段。我的想法是实现一个自定义序列化程序,当我想做一致性检查时会使用它。换句话说,自定义序列化程序对@IgnoreConsistencyCheck 的作用与对@JsonIgnore 的作用相同。

这是一个示例对象:

public class Model implements Serializable {
    @JsonIgnore
    private int id;
    private String name;
    private String description

    @IgnoreConsistencyCheck
    private Date creationDate;
}

是否可以通过扩展Jackson代码来实现?

谢谢

【问题讨论】:

  • 您希望何时检查数据的一致性(来自两个不同的数据源)?在反序列化过程之后?
  • 序列化后是的。为此,我正在使用 Skyscreamer JsonAssert 或 JsonEquals。我的主要目的是不序列化我想在一致性检查中忽略的字段。这有意义吗?

标签: java jackson


【解决方案1】:

您可以编写自定义过滤器,然后使用@JsonFilterObjectMapper 配置连接它。

过滤器代码(CC 代表“一致性检查”):

class IgnoreCCFilter extends SimpleBeanPropertyFilter {

    @Override
    public void serializeAsField(Object pojo, JsonGenerator jgen, 
                      SerializerProvider prov, 
                      PropertyWriter writer) throws Exception {
        if (includeField(writer)) {
            writer.serializeAsField(pojo, jgen, prov);
        }
    }

    private boolean includeField(PropertyWriter writer) {
        return writer.getAnnotation(IgnoreConsistencyCheck.class) == null;
    }
}

型号:

@JsonFilter("ignoreCCFields")
public class Model implements Serializable {
    @IgnoreConsistencyCheck
    private int id;
    private String name;
    private String description

    @IgnoreConsistencyCheck
    private Date creationDate;
}

ObjectMapper 配置:

ObjectMapper objectMapper = new ObjectMapper();
PropertyFilter propertyFilter = new IgnoreCCFilter();
objectMapper.setFilters(new SimpleFilterProvider(
            Collections.singletonMap("ignoreCCFields", propertyFilter))
);

【讨论】:

  • 我同时找到了另一个解决方案,它可以优雅地解决它。 Jackson 支持 MixIn。因此,每当我想覆盖或忽略某个字段时,我都会使用这些注释创建一个界面。 ObjectMapper 映射器 = 新的 ObjectMapper(); mapper.setMixInAnnotations(getMixInMappingsFromClasspath()); writer = mapper.writer().withDefaultPrettyPrinter();
  • @user3092750 最好将该解决方案发布为您问题的答案。也许它会在未来帮助某人。 help/self-answer
猜你喜欢
  • 2015-07-11
  • 2016-01-08
  • 2013-08-11
  • 1970-01-01
  • 2016-02-19
  • 2013-05-20
  • 1970-01-01
  • 2019-05-21
  • 1970-01-01
相关资源
最近更新 更多