控制hibernate validation校验顺序

背景

       项目使用的是hibernate validation校验框架(不懂的可以参考这篇文章:Bean Validation)。对二维码id的校验,需要校验长度及非法字符。由于非法字符是通过正则表达式匹配的,存在效率不高的问题,需要控制下校验顺序,即先校验长度,然后再校验正则表达式。

解决方案

       hibernage validtaion框架有校验分组的概念,指定校验注解的时候可以加上分组,如果没有指定,那么默认是Default分组。我们先创建一个分组:

public interface Extended{}

然后校验注解指定属于这个分组:

@Length(min=3,max=100) // @Length没有指定group,则属于Default分组
@CharValid(groups = Extended.class) // @CharValid是个自定义校验注解
String id;

然后创建一个分组顺序:

@GroupSequence({Default.class, Extended.class})
public interface MySequence {}

通过@GroupSequence指定分组顺序,例如这里先校验Default分组,再校验Extended分组。然后将这个顺序作为参数传入校验方法:

validator.validate(object, MySequence.class);

 问题:

        虽然指定了校验顺序,但是还是会去校验@CharValid注解,还是会导致效率问题。这里需要让@Length校验不通过时就直接返回,因此需要把校验模式改为快速失败:

// 原来的validator获取方式
//ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
//validator = factory.getValidator();

validator = Validation.byProvider( HibernateValidator.class )
                .configure()
                .failFast( true ) // 设置快速失败
                .buildValidatorFactory()
                .getValidator();

这样一来@Length校验不通过的话,就不会再去校验后面的东西了,直接返回结果。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值