使用注释进行验证很慢

Ele*_*a T 2 java validation spring hibernate bean-validation

为什么spring验证比自己验证慢?我想避免编写自己的验证器。

购物车中有 20,000 件商品(没有导致验证异常)并调用我们在这些时间获得的两个其余端点:/test/spring -> 62.145 ms /test/own -> 11.35 ms

两个端点都运行了 200 次。得到的时间是平均时间。带有 20.000 件商品的购物车当然是不现实的,这也不是重点。

    @RequestMapping(path = "/spring", method = RequestMethod.POST)
    public ResponseEntity<Object> postSpringValidation(@RequestBody **@Valid** Cart cart) {
        return new ResponseEntity<>(HttpStatus.CREATED);
    }


@RequestMapping(path = "/own", method = RequestMethod.POST)
    public ResponseEntity<Object> postOwnValidation(@RequestBody Cart cart) {
        if (!cart.isValidData()) {
            throw new InvalidParameterException("invalid data");
        }

        return new ResponseEntity<>(HttpStatus.CREATED);
    }

public class Cart {
    @NotNull
    private String id;

    @Valid
    @NotNull
    private List<Item> items;

    public boolean isValidData() {
        if (id == null)
            return false;

        for (Item item : items) {
            if (!item.isValidData()) {
                return false;
            }
        }

        return true;
    }
}

public class Item {
    @NotNull
    private String id;

    public boolean isValidData() {
        if (id == null)
            return false;

        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

hov*_*yan 6

Spring 验证实现JSR-303 / JSR-349

验证程序的部分解释了发生在验证时触发。您必须考虑全局验证框架的工作中涉及的内容。

  • 您需要有某种方法来检测哪些类已声明约束,哪些类未声明

  • 您需要一种方法来区分构造函数/方法/字段约束

  • 您需要实现某种对象图来验证深度嵌套的结构

文档的这一部分都涵盖了这些内容

与在您的类中使用一个执行验证的内嵌方法相比,操作整个验证基础结构预计会更繁重。

与自定义实现相比,拥有统一的应用验证方式更好。自定义实现容易出错且难以维护。

与自定义验证相比,任何验证框架的性能开销都应该可以忽略不计。

您为您的产品创建了不切实际的案例。我怀疑您是否有人一次购买 2 万件商品。即使您允许,客户也无法付款。大多数支付提供商和银行会将此交易标记为荒谬并予以否认。