具有完整 POJO 数据绑定的 Jackson 自定义过滤器

Jackson custom filter with full POJO data bind

这个问题扩展了

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

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

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

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

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

时进行验证

我建议通过使用 Jackson 和 Hibernate Vaildator correspondingly. The idea is first to deserialize json data into POJO, and then validate the POJO according to the requirement. In you case, you can apply Class level constraints 进行验证来分离反序列化和验证问题。 Class 级别约束具有很大的灵活性,可以通过访问对象实例来验证多个相关属性。它简单而强大。

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