具有完整 POJO 数据绑定的杰克逊自定义过滤器

Posted

技术标签:

【中文标题】具有完整 POJO 数据绑定的杰克逊自定义过滤器【英文标题】:Jackson custom filter with full POJO data bind 【发布时间】:2017-01-28 22:59:09 【问题描述】:

这个问题延伸到this question。

虽然如果您只有几个字段,以前的解决方案效果很好,但当您有十几个字段时,它变得无法维护。现在,我当前的设置使用完整的数据绑定,所以我有一个 POJO,Jackson 将使用它来自动反序列化 JSON。

但是,和以前一样,某些字段具有需要通过的约束。本质上,我正在寻找类似于this 的答案,但不需要设置任何属性。只是一个自定义反序列化器,它将充当过滤器并在字段不满足约束时抛出自定义异常。如果过滤器结束时没有抛出异常,Jackson 应该自动将 JSON 绑定到 POJO。

【问题讨论】:

【参考方案1】:

似乎Json Schema 可能满足您的需求。它允许在反序列化之前对 json 字符串进行灵活(和复杂)的验证规则。它包括必填字段、基于正则表达式的值检查、行业标准格式(例如,您可以将字段定义为“电子邮件”格式)、跨字段依赖项(在最新 v4 中)等

以上是独立于语言的标准。至于 Java 实现,我使用了支持最新 json 模式版本的this one(标准仍在发展中)。验证器的初始集成工作量很大,(因为我的 json 模型非常动态),但之后引入新的验证规则非常方便(只需更改 json 模式文件)

【讨论】:

嗯,我想知道是否可以在不引入新依赖项的情况下做到这一点。你知道Jackson是否有这样的功能吗? 它没有。我不知道任何其他具有 json 验证功能的库【参考方案2】:

我建议通过相应地使用 Jackson 和 Hibernate Vaildator 来分离反序列化和验证的关注点。思路是先将json数据反序列化成POJO,然后根据需求对POJO进行校验。在您的情况下,您可以申请 Class level constraints 进行验证。类级约束具有很大的灵活性,可以通过访问对象实例来验证多个相关属性。它简单而强大。

通常验证需要更高级别的关注点。最好在反序列化后处理这个问题。这样做可以使代码更容易管理和重用 POJO 和验证规则。

【讨论】:

【参考方案3】:

只是考虑一下:如果您不关心反序列化期间的验证,请尝试为您的 POJO 类添加 @JsonIgnoreProperties(ignoreUnknown = true) 注释。您可以稍后在实际业务逻辑与 pojo 类一起使用时进行验证。

【讨论】:

以上是关于具有完整 POJO 数据绑定的杰克逊自定义过滤器的主要内容,如果未能解决你的问题,请参考以下文章

如何在杰克逊序列化中自定义日期,@JsonSerialize 不起作用

angularjs随笔01 数据双向绑定理解 自定义过滤器 时钟更新列子

杰克逊阵列到 Pojo 不只在 Android 上工作

将 json 字段绑定到 POJO 中具有不同名称的字段的注解

选择的自定义绑定无法将对象作为值处理

如何更改杰克逊以检测 POJO 中的所有字段,而不仅仅是公共字段?