Java 使用注释进行验证很慢
为什么spring验证比自己的验证慢? 我想避免编写自己的验证器 在购物车中有20000个项目(没有导致验证异常),并调用我们在这些时间得到的两个rest端点:/test/spring->62.145 ms /测试/拥有->11.35毫秒 两个端点都运行200次。产生的时间是平均时间。 拥有20000件物品的购物车当然不现实,这也不是重点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
@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内部的慢,并建议更改。