Jackson定制过滤器,具有完整的POJO数据绑定

时间:2016-09-20 21:20:52

标签: java json jackson pojo jackson2

此问题延伸this question

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

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

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:2)

只是考虑:如果您在反序列化期间不关心验证,请为您的POJO类尝试 if(FBSDKAccessToken.currentAccessToken().hasGranted("user_friends")){ let request : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "/me/friends", parameters: nil,HTTPMethod: "GET") request.startWithCompletionHandler({ (connection, result, error) -> Void in if((error == nil)){ print(result) }else{ print(error) } }) }else{ print("Publish action permission not granted") } 注释。您可以稍后在实际业务逻辑与pojo类一起使用时进行验证。