Java 使用注释进行验证很慢

Java 使用注释进行验证很慢,java,spring,hibernate,validation,bean-validation,Java,Spring,Hibernate,Validation,Bean Validation,为什么spring验证比自己的验证慢? 我想避免编写自己的验证器 在购物车中有20000个项目(没有导致验证异常),并调用我们在这些时间得到的两个rest端点:/test/spring->62.145 ms /测试/拥有->11.35毫秒 两个端点都运行200次。产生的时间是平均时间。 拥有20000件物品的购物车当然不现实,这也不是重点 @RequestMapping(path = "/spring", method = RequestMethod.POST) public R

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

在购物车中有20000个项目(没有导致验证异常),并调用我们在这些时间得到的两个rest端点:/test/spring->62.145 ms /测试/拥有->11.35毫秒

两个端点都运行200次。产生的时间是平均时间。 拥有20000件物品的购物车当然不现实,这也不是重点

    @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;
    }
}
@RequestMapping(path=“/spring”,method=RequestMethod.POST)
public ResponseEntity postSpringValidation(@RequestBody**@Valid**Cart){
返回新的ResponseEntity(HttpStatus.CREATED);
}
@RequestMapping(path=“/own”,method=RequestMethod.POST)
公共响应性postOwnValidation(@RequestBody购物车){
如果(!cart.isValidData()){
抛出新的InvalidParameterException(“无效数据”);
}
返回新的ResponseEntity(HttpStatus.CREATED);
}
公共类购物车{
@NotNull
私有字符串id;
@有效的
@NotNull
私人清单项目;
公共布尔值isValidData(){
if(id==null)
返回false;
用于(项目:项目){
如果(!item.isValidData()){
返回false;
}
}
返回true;
}
}
公共类项目{
@NotNull
私有字符串id;
公共布尔值isValidData(){
if(id==null)
返回false;
返回true;
}
}

Spring验证实现/

说明了在触发验证时会发生什么。您必须考虑全局验证框架的工作中涉及的内容

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

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

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

这些都包括在这本书中

与在类中使用一个在线方法进行验证相比,操作整个验证基础结构的工作量预计会更大

使用统一的方法应用验证比使用自定义实现更好。自定义实现容易出错且难以维护

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

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

尝试调试代码-您将看到spring不仅仅是调用
shop.isValidData
。但我问自己的问题是:为什么这很重要?这可能不是你想要优化的东西……要注意到有意义的差异需要多少项?对于实际用户来说,项目计数现实吗?忽略“这不现实”的愚蠢回答,spring会遇到的一个问题是,您为CPU时间带来的便利而付费。在很多地方,似乎是反射导致速度变慢。如果你想让你的API更快,你必须放弃spring帮助你的任何东西,包括不使用注释来映射变量和自己写响应。您应该考虑使用jVisalVM,因为您可能能够找到Spring内部的慢,并建议更改。