00:00
前面我们基于GSR303做了数据校验功能,并且使用controller advice以及exception handler完成了集中处理所有异常的统一异常处理。那接下来呢,我们再来关注一个数据校验里边更高级的功能叫分组校验。我们想象一个场景,比如我们在新增或者修改品牌的时候,如果我们新增的情况下我们想要校验的字段跟修改的情况下想要校验的字段。以及他们相关的规则有可能是不一样的,比如新增,由于我们品牌ID是自增的,所以我们新增我们不需要携带品牌ID,也不能带,而修改的时候呢,我们就必须携带品牌ID,否则我们不知道要修改哪个品牌,同样的品牌名,无论是新增还是修改,品牌名都不能是空的。再比如其他字段新增的时候呢,我们第一次要全部录入,而修改的时候不变的字段我们可以不用提交,我们在用post慢测的时候,Logo不变了,那我们就不提交logo了,那基于这些场景我们应该怎么做呢?我们就可以使用GSL303提供的分组校验功能,分组校验功能想使用,首先我们得给这些校验注解上,它呢有一个属性叫groups来标注我们这个校验注解,它是属于哪一种情况才进行校验的,比如它属于哪一组,每一种校验注解都可以标注groups,那我们来加上品牌ID,品牌ID呢,现在我们有两种情况是它必须为空和必须不为空,我们叫note no。
01:44
而必须为空是在新增的时候是必须为空的,所以我在这来提示一下message新增。不能指定ID,而我们这一块呢,提示就是修改。
02:03
必须指定品牌ID。但这两种校验规则呢,是在不同情况下触发的,那我们怎么办?我们需要在这儿来给他们指定,他们是在哪种情况下触发,比如有一个group,而且这个groups呢,来点过来,它是一个类型的数组,比如说我们可以有非常多种情况。1234,我们比如134这种情况,触发这个校验,那么就可以写这么一个数组,而这必须是一个类型,而且这一块规定这个类型必须是一个接口,所以我们在这儿需要写一个接口类型。比如举一个例子,我们后来所有的系统可能都要用到分组校验功能,我将这些接口呢,我就写到common里边,我在这抽取一个歪类的包,跟校验有关的,我们来写一个接口。
03:00
首先第一个接口叫and group,比如说我们在做新增的时候,它属于新增的分组,包括呢,我们还有一个update group,我们这个接口啊。写一个空接口就行了,也不用做任何实现,来我们这个呢,就叫update,这是修改分组,这个接口相当于只是一个标识,接下来来到我们的校验注解上,我们来指定not not,它必须是update group。在做修改的时候才需要进行校验的字段,而an呢,这个空,那就必须是在新增的时候才需要校验这种规则,那我们写一个and group,而我们品牌名必须提交,也就是无论你是新增还是修改都是必须提交的,所以我们就可以写一个groups,那么这两种情况都需要and group也是需要校验的和update。这种情况也是需要校验的,相当于我们为每一个注解标注了它适用于哪一种情况才开始校验,这是我们要做的第一件事,给注解上标注。
04:16
给咱们这个校验注解,校验注解标注。什么情况需要进行校验,相当于我们写了一个分组接口,那我们想要完成这种分组校验功能,接下来我们就需要在controller上,接下来我们的第二步,我们在controller上我们来标注,我们在校验的时候说,告诉他这个是一个新增,你只需要校验新增这一组里边的所有校验规则,而这个Y里边呢,它没有任任何其他属性,所以我们可以使用另外一个胶然注解,我们叫vaated。这个教案注解呢,是spring框架提供的教案注解,而valid呢,这是规范,我们把这个拿过来,这是valid里边,它可以来指定一个class,那这个class呢,就是指定specificify,我们来指定一个或者多个我们的校验分组,它呢就会按照这些校验分组去来进行校验,那好,我们现在呢就在这来指定,我现在呢是一个添加,所以我只需要校验添加组的,这是我们第二步要做的事情,我们把它复制过来,那么来测试一下整个效果。
05:32
我重新启动商品服务。我们来到postman里边进行测试,这是我们新增,那新增呢,我们标注了有这么几个,一个呢是我们新增的时候,品牌ID必须不能指定,而且品牌名也必须提交,那其他我们没指定的这些校验字段,那它到底是加上校验还是不加校验,我们可以看一下效果,我们提交了一个logo,提交了一个名字,我们现在是新增,我们还给他提交一个品牌ID,那这个是校验部通过的,我们先来给他加上。
06:09
比如品牌ID等于一,我们来send发送出去。我们发现呢,这一块叫参数格式校验失败,也就是说新增的时候啊,不能指定ID,那么再来测试,我们不给它指定ID了,但是我们给他提交的logo是ABC不对的,但是我们这个logo的校验注解,它并没有指定是属于哪一个分组,我们看新增的情况下叫不叫验logo,我们来进行一个测试send。我发现呢,这是success成功的,那就说明一个问题,我们没有标注分组的这校验注解默认它是不起作用的,我们想让它起作用,我们就必须给它指定它是属于哪一种组的,好比如我们这个是属于添加组的。还有我们修改组的。那修改的情况下呢,只要我们携带了logo logo有值了,那就必须校验成URL了,但是没有携带的情况下,那我们什么也不用改,但是这个not empty呢,我们在新增的时候给他约束一下就行了,Groups它是属于新增的,这样的话,新增的时候note这个logo就必须不能为空,但是修改的时候呢,可以为空,但你一旦修改了不为空了,你就必须是一个合法的URL地址,那现在来测试一下我们这个新增呢,肯定就会再来校验我们的logo字段。
07:33
我们发送请求再次进行测试,我们现在是新增,以前呢不校验logo字段,我们现在来给它校验send,我们在这呢提示logo必须是一个合法的URL地址,但是呢,我们可以不提交,那不提交的话呢,这整个字段都是没有的,那没有也就不用触发这个URL校验了,当然这个note empty不为空校验是只有在新增的时候才触发的,那么此时呢,就应该会触发一个不为空的校验来send,我们发现呢,Logo不能为空。
08:06
那同样我们来测试修改功能,我们将修改的这一块代码,我们也让它进行校验,按valid,诶我们使用valid,它可以来指定校验分组,我们指定呢,它是属于update这个分组下的up date group.class我们给它重新运行一下,现在我们来测试修改,如果是修改情况。我们会校验这些字段。首先。我们要修改的情况,我们的品牌ID必须指定。那如果我们不带就有问题了,而且如果修改的话,品牌名就算改也不能改成空的,我们在这儿也指定了,而且logo地址呢,我们把这个也换成note blank字符串,我们都用blank这logo地址呢,修改的时候会触发URL这个验证,但是不触发note blank验证,也就是说修改的时候你可以不携带,但是你带了就必须是一个URL地址,那我们来测试一下,我来测试不带品牌ID,但是还带了一个非法的URL地址,我们现在来发送修改请求,Send。
09:18
这一块呢,就会提示品牌ID必须指定,而且logo也必须是一个合法的URL地址,但是我们要不带logo了,我们来send请求,他呢只会来校验品牌ID,那我们带上品牌ID了,他就会修改成功brand ID。来写一个1SEND。现在这个修改呢就是成功的,但是其他的校验字段,比如排序不能为空,还必须大于零,这些都不生效了,因为他们都没有编写他们的分组情况。那我们把它们写完,在这一块来进行first letter进行验证的时候,如果我们修改或者新增,无论如何他们都必须是一个字母,但是修改呢,可以不携带,那不携带就相当于保存数据库的原样,所以我们这个note empty它呢只是在新增的时候生效,新增的时候要额外多验证一个非空。
10:23
下边也一样,新增的时候要验证是非空,但修改的时候呢,可以为空。但是如果一旦带了,就必须符合我们的要求,把它们全改成这样子的。我们的controller呢?只需要使用validated注解来指定我们现在校验哪一组。这就是我们说的分组校验,使用validated指定我们要校验哪一组,然后呢,给我们的校验注解标注上他们的分组情况,而且呢,注意一点,默认没有指定分组的校验注解,比如我们这note blank没有指定分组。
11:09
在分组校验情况下不生效,那什么时候生效呢?它只会在不分组,什么叫不分组?比如我们另外一个校验的时候,我们在这只告诉他进行校验,但是不告诉他属于哪一组,那这样的话呢,没有标注分组的注解就会生效,标注了分组的到不会生效了,所以说它只会在at va decade这种情况下。生肖也就是呢,不校验分组。而分组校验情况是我们校验的时候指定了分组。他可以帮我们来完成多场景的复杂校验。
我来说两句