我开始使用弹簧验证,但如果我编写自定义验证器并注释请求参数,@Validate
验证是否在反序列化之前进行?春季验证是要走的路吗?
不,验证仅在反序列化后发生,正如 Mark Bramnik 已经回答的那样。您可以通过 Standard JSR 验证器或通过 Spring Specific 来执行此操作,它总是在反序列化之后发生。
我在想我可以编写一个自定义反序列化器来调用我的自定义验证器,但这是最好的方法。我正在寻找最佳实践和良好的验证策略。
这些事情没有标准的策略,一切都要根据具体情况而定。有时,您需要自定义验证器,有时则不需要。有时,您需要自定义反序列化器,有时则不需要。只需尝试满足您的业务需求,其他一切都应该开始符合要求。
现在有趣的部分,
现在我制作了一个带有@ControllerAdvice注释的异常处理程序控制器,以在异常冒泡给用户之前捕获它们,但是有没有办法在杰克逊反序列化之前验证用户输入以检查错误?
是的。有一种方法,它被称为json 模式验证(即你有一个 json 模式文件,并且你根据它验证你的原始 json)&据我所知,这主要是一个缓慢移动的领域,很可能也死了。我不建议混合 Bean 验证(使用 Jackson、GSON 等反序列化后进行的验证)和模式验证 - 只选择一个(因为你的代码不应该花太多时间只做验证并且目标重叠太多两种方法),我猜在大多数地方,bean 验证是首选。
Schema 验证有它自己能想到的优势,
1.验证逻辑从您的 REST 业务逻辑中移出(从控制器、bean 等中移出),并且您的反序列化器总是得到经过验证的 JSON。这样代码看起来更干净。
2.JSON 验证逻辑更改无需重新编译代码即可处理,因为您只需要更新架构文件。使用 Bean 验证,您总是需要重新编译工件。
3.按原样验证原始数据总是比反序列化后验证更准确。来自 JSON 的具有无效月份的日期字符串可能会被转换为 Java 中的有效 Date 对象。
4.性能:根据我阅读的大多数博客,模式验证比 bean 验证快。
我不确定为什么它不受欢迎,可能是 Spring 的人让编写验证太容易了,维护模式很困难 :)
请参阅这些 SO QA 和链接以了解更多信息,
如何验证 REST 服务中的传入 JSON 数据?
在 Java 中针对 Schema 验证 JSON
JSON 模式验证工具
Spring REST API 中的 Json 模式验证
正如您在阅读上面所感受到的那样,JSON 模式验证是以纯 Java 方式完成的,而不是由 Jackson 或 Spring Boot 支持。