我使用spring boot来运行API。我想在反序列化之前验证用户请求参数,以防止jackson抛出反序列化异常。我的想法是,无需例外处理即可验证,但如果您认为我错了,请告诉我。
现在我创建了一个带有@ControllerAdvice
注释的异常处理程序控制器,以便在它们冒泡到用户之前捕获异常但是有没有办法在jackson反序列化之前验证用户输入以检查错误?
我开始使用弹簧验证但是如果我编写自定义验证器并使用@Validate
注释请求参数,那么在反序列化之前是否会进行验证?弹簧验证是否可行?
我查看了带注释的验证(JSR 380),但我认为我需要更多的控制验证,这就是我编写自己的自定义验证器的原因。
我在想我可以编写一个调用我的自定义验证器的自定义反序列化器,但这是最好的方法。我正在寻找最佳实践和良好的验证策略。
提前感谢您的帮助。
答案 0 :(得分:1)
Spring Validation是对Bean状态的检查。 Bean类具有注释,它们对Bean字段值施加了一些约束。
因此,为了调用“验证过程”,该bean应该已经存在。用请求附带的字符串json / xml表示形式创建bean就是一个反序列化过程。
因此,答案是,spring首先使用某些库(例如杰克逊)对对象进行反序列化,然后才尝试通过使用验证技术来验证输入。
答案 1 :(得分:1)
我开始玩Spring验证,但是如果我写了一个 自定义验证程序,并使用
@Validate
注释请求参数 验证是否在反序列化之前进行?是春天 验证要走的路?
否,仅在Mark Bramnik回答后,反序列化之后才会进行验证。您可以通过标准JSR验证器或特定于Spring的方法来执行此操作,反序列化之后总是会发生这种情况。
我当时想我可以写一个自定义的反序列化器来调用我的 自定义验证器,但这是执行此操作的最佳方法。我在找 最佳做法和良好的验证策略。
对于这些事情没有标准的策略,所有情况都视情况而定。有时,您需要自定义验证器,有时则不需要。有时,您需要自定义解串器,有时则不需要。只需尝试满足您的业务需求,其他所有内容都应符合要求。
现在有趣的部分,
现在,我用一个 @ControllerAdvice批注可在异常冒泡之前捕获异常 给用户,但是有一种方法可以在杰克逊之前验证用户输入 反序列化以检查错误?
是的。有一种方法及其称为 json模式验证(即,您有一个json模式文件,并根据它验证了原始json),据我所知,这通常是一个移动缓慢的字段,可能也死了。我不建议将Bean验证(使用Jackson,GSON等进行反序列化后进行的验证)和模式验证混合使用-仅选择一个(因为您的代码不应花太多时间仅进行验证并且目标上有太多重叠)两种方法),我想在大多数情况下,bean验证是首选。
模式验证具有我可以想到的优点
1。验证逻辑移出REST业务逻辑(从控制器,Bean等移出),并且解串器始终获取经过验证的JSON。这样代码看起来更干净。
2.JSON验证逻辑更改无需重新编译即可处理,因为您只需要更新架构文件即可。使用Bean验证,您始终需要重新编译工件。
3。按原样验证原始数据总是比反序列化后验证更准确。 JSON中带有无效月份的日期字符串可能会转换为Java中的有效Date对象。
4.Performance:根据我读过的大多数博客,架构验证比bean验证更快。
我不确定为什么它不受欢迎,可能是Spring员工使编写验证过于容易并且维护模式很困难:)
请参阅这些SO质量检查和链接以了解更多信息
How do I validate incoming JSON data inside a REST service?
Validate JSON against Schema in Java
Tool for JSON schema validation
Json schema validation in Spring REST APIs
通过阅读上面的内容,您可能会感到JSON模式验证是以纯Java方式完成的,而不是Jackson或Spring Boot支持的。