【问题标题】:Spring Boot Validation Strategy Before Deserialization反序列化前的 Spring Boot 验证策略
【发布时间】:2018-02-09 07:09:03
【问题描述】:

我正在使用 Spring Boot 来运行 API。我想在反序列化之前验证用户请求参数,以防止杰克逊抛出反序列化异常。我的想法是最好在没有异常处理的情况下进行验证,但如果您认为我错了,请告诉我。

现在我制作了一个带有@ControllerAdvice 注释的异常处理程序控制器,以便在异常冒泡给用户之前捕获它们,但是有没有办法在杰克逊反序列化之前验证用户输入以检查错误?

我开始使用 spring 验证,但是如果我编写自定义验证器并使用 @Validate 注释请求参数,验证是否会在反序列化之前进行?春季验证是要走的路吗?

我研究了使用注释进行验证 (JSR 380),但我认为我需要对验证进行更多控制,这就是我编写自己的自定义验证器的原因。

我在想我可以编写一个自定义反序列化器来调用我的自定义验证器,但这是最好的方法。我正在寻找最佳实践和良好的验证策略。

提前感谢您的帮助。

【问题讨论】:

    标签: spring-boot deserialization spring-validator jackson2


    【解决方案1】:

    我开始玩弹簧验证,但如果我写一个 自定义验证器并使用 @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.Performance :根据我阅读的大多数博客,模式验证比 bean 验证更快。

    我不确定为什么它不受欢迎,可能是 Spring 的人让编写验证太容易了,维护模式很困难 :)

    请参阅这些 SO QA 和链接以了解更多信息,

    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 支持。

    【讨论】:

      【解决方案2】:

      Spring Validation 是对 Bean 状态的检查。 Bean 类具有注解,它们对 bean 字段值施加了一些约束。

      因此,为了调用“验证过程”,bean 应该已经存在。使用请求附带的字符串 json/xml 表示创建 bean 正是一个反序列化过程。

      因此答案是 spring 首先使用一些库(例如 jackson)反序列化对象,然后才尝试通过应用验证技术来验证输入。

      【讨论】:

        猜你喜欢
        • 2021-02-11
        • 2017-02-01
        • 2019-04-23
        • 2018-06-22
        • 1970-01-01
        • 2021-07-29
        • 1970-01-01
        • 2011-05-20
        • 2017-12-24
        相关资源
        最近更新 更多