00:00
前面呢,我们测试了一下分组校验的功能,接下来我们再来测试一个叫自定义校验,我们这个自定义校验该如何使用,特别是我们在提交品牌信息的时候,比如我们这个受status,它的显示状态是一个零或者一,那如果我们想要校验它,我们可以使用第一种方式,正则表达式,当然有些时候呢,光正则可能不能完成我们业务的校验功能,我们以它为例,我们就可能需要一个自定义的校验逻辑,那怎么用呢?我们也希望像以前一样标一个注解,它给我们自动去校验,有错误信息,抛出错误信息,那想要用自定义校验功能,那么就首先得分为这三步,第一步我们自己呢,编写一个自定义的校验注解,那这个校验注解要能工作每一个注解啊,它其实都关联一个自定义的校验器,所以我们还得编写一个自定义的校验器,然后呢,我们让这个校验器。
01:00
去来校验这个注解标注的字段,相当于最后一步就是关联我们自定义的校验器和咱们这个自定义的校验注解,以后呢,我们用使用这个校验器自动校验这些注解标注的字段,那么先要做的第一步就是我们先来编写一个自定义的校验注解,比如我们要完成校验受受呢,只能是零或一两种值,我希望呢,假设有这么一个注解,比如我们就叫an。List value,哎,叫列举的值,我们希望呢,有这么一个注解,在这个里边呢,有一个属性叫values,这values里边规定了你能使用哪几种值,比如我写了一个零和一,那这样呢受statuss就只能是零或一两种情况,那我们就可以先来创建这个自定义的校验注解,我们先来右键new一个,那么创建这个例色Y6校验注解,好,它来完成我们自定义校验功能,但这个校验注解该如何编写,我们可以参照我们以前的,比如note blank,首先一个校验注解它必须满足规范,在GSR303规范中,我们这个校验注解首先必须拥有三个属性,这三个属性第一个叫message,就是当我们这个校验出错以后,错误信息去拿取,默认是使用这个属性去我们validation message properties配置文件中取第二个是groups,也就是他也要支持分组校验的功能。
02:32
第三个是paylo,我们自定义校验注解,还可以自定义一些负载信息,好,我呢就将这三个属性第一步先复制过来,第二步作为一个校验注解,它还必须标写这些原信息数据,比如第一个target,我们这个注解可以标注在哪些位置,方法、属性、参数、构造器等等。第二个我们这个校验注解的实际我们可以在运行时获取的,包括最重要的concentrate,我们这个校验注解是使用哪个校验器进行校验的,在这一块可以指定校验器这一块不指定,就要在初始化的时候去来指定,那我就把标头这一块直接一复制,这个可重复注解我就可以不用复制了,我先复制一个它。
03:17
把它复制过来,然后呢来导入相关的包,那这一块的包是属于Java X validation API里边的,那我们就先得导入validation API,我们来到common po文件中,我们将这些通用的校验功能我们全部编辑在common里边,我在它里边依赖一个叫validation API,这是Java X旗下的,那它的整个全坐标那就是这样子的。那完了以后呢,我们接下来把它们导入进来。重新导入,包括paylo,这就是我们指定的这个校验注解,而且这个校验注解呢,我们需要指定它的这个value,那这个values呢,可以是一个int的数字,好,我们就在这来指定一下,比如我们来写一个int的数字,它values,那默认呢就是没有的值。
04:13
我们来写一个默认,那我们希望只要我们这个受status字段标了list value,那它就必须是这两种值,而且出错了以后,我们来写一个message,我们可以自己给错误消息,那也可以,什么呢?我们在这个校验注解上定义了一个message,这个message来指一个变量,这个变量呢,一般是我们这个校验注解的全类名,我们copy reference复制一下,然后呢,在这。配上它呢,会在配置文件中取出它配置的消息作为我们错误提示,在哪个配置文件中获取呢?我们GSL303规范里边有一个配置文件叫validdation,我们来搜一下validation message properties就是在这些配置文件中获取的,所以我们自己呢,也创建一个配置文件来new一个file,这个file呢,我们就把这个配置文件的名字我来复制一下,Copy pass,好,我们来创建一个这个配置文件跟它名一样的,我们叫validation properties。
05:17
创建一个配置文件,而配置文件中呢,我们来配上我们这个校验注解啊,它是取出这个属性的值,好,那它的值呢,我们就叫必须提交指定的值,我们这呢,指定了两个值,零和一,我们相当于将错误消息配在这了,当然我们也可以用message写在这,我们先来看配在这的情况,那这校验注解那就有了,那我们想要校验它怎么办呢?大家来看一下,校验注解上呢,有一个叫concentrate,它可以来指定validated by,用什么东西来校验?我们点一个这个valid by,我们需要指定一个这个数组,它的这个类型呢,是一个concentrate valid想使用它来进行校验的,但可以拥有多个校验器,那我们就来编写一个自定义的校验器。
06:14
我们在这来编写一个class,这个class呢,就叫list value。Concentrate,好,他必须呢?来实现,我们来看一下这个va呢,它是一个接口,它必须实现这个接口,接口呢又有两个泛型,第一个泛型来指定注解,第二个泛型指定我们要校验什么类型的数据,因为我们这个注解是标注在了integer类型上的,所以我们第二个我们就应该写一个的泛型,我们来到这,让他来实现我们这个接口叫concentrate valued,然后呢,两个泛型,第一个泛型是我们校验注解,叫list value,第二个泛型它是标在integer字段的。
07:01
我们就来写一个in配,然后添加它为实现的方法,把这两个方法我们都填上,这两个方法呢,第一个叫初始化方法,初始化方法初始化方法呢,它会将整个这个list和Y6注解的详细信息,我们在这标了list value6注解,还在Y6S里边指定了两个值,会将这个详细信息给我们。那我们就可以先来获取一下这个详细信息,我们来到自定义的校验器里边,我们将这个里边的详细信息,其中有一个就叫values,这个values啊,说明了我们给定的值必须是指定的这些东西,那为了后来方便判断,在下边呢,我们看到这有一个is valid,判断是否校验成功,这个是否校验成功呢,会返回触或false,而它传入两个参数,第一个是inte的Y6,这个Y6就是我们把这个注解标在了这个字段,这个字段上一次提交过来的需要校验的值,比如他提交过来了一个三,三不在零和一范围内,那就是校验失败,所以我们在这个校验器里边,我们就应该判断这个Y6是否满足这个范围,那为了判断呢?嗯,简单,我们private里边我可以先写一个set,我给set里边呢装一些integer的数据,我们这个set呢,就得。
08:24
对,你有一个哈希set。然后呢,我们将所有可能的这个值我们全放在set里边,判断我们提交的东西有没有在这个set里边就行了,好,我们将它遍历,然后都放到这个set里边,set.and。Va al,但在这一块呢,大家最好要做一些非空判断,防止我们这个便历没数据,然后接下来我们在这儿进行遍历,这个Y6呢,就是我们提交的值,我们在这批注一下,这个Y6就是需要校验的值,这个是整个校验的上下文环境信息,好,我们拿到这个VALUE6怎么校验呢?我们只需要if判断我们的这个set里边有没有包含他提交的这个Y6值,如果包含了,那就返回处,没包含就返回false,所以包不包含返回这个结果。
09:24
我们在这呢写了一个自定义的校验器,那为了让它俩产生关联,我们必须在list value里边用valid by by什么呢?我们将我们这个校验器指定一下,叫list value concentrate value第class,我们这个自定义校验的功能就写好了,我们来测试一下,比如它是在什么时候生效,比如我们这个groups必须在添加的时候,添加的时候必须携带,那修改不携带了,我们不说携带了,也就得进行校验好,我们现在来测试一下。
10:01
Rita。现在呢,我们想要添加一个,它必须是我们指定的值,我们在这呢进行一个测试,我们在这调用它的save方法,我们添加呢不带品牌ID,但是我们现在给show status给上。我们不对的是受status,我们必须是零或一,我给了一个三,我们现在来发送请求。我们看一下效果,这里呢,出现了一个叫系统未知异常,我们来看一下这个异常,能出现这个系统未知异常,说明被我们controller advice给接收到了,我们来找一下我们全局的那个controller advice。在product里边,Exception在这被这感知到了,那为了方便起见,我们来log记录一下,我们出现了一个异常错误,把这个错误throw able直接在这打印一下,现在来重新启动进行测试。我们编写了一个自定义的校验注解,并且将它与这个校验器相互关联,我们来进行测试。
11:07
我们受status现在是三,我来点击send,好来看一下我们这一块的报错。报错的原因是我们这个杰森这个数据转换异常,那我们提交的数据不对,这还没来到校验,我们这多了一个逗号,好,我们重新send的,现在我们看到有一个show status,它打印时必须提交指定的值,而且这一块的信息就是我们在这配置的,我们在validation properties里边配置的,这就是我们说的自定义校验,那自定义校验的步骤就结束了,编写一个校验注解和校验器,主要这个校验器它的类型是concentrate va。我们将它复制过来。然后呢,为了关联校验注解跟校验器,我们必须使用这种方式给校验注解上要批注valid by,我们们用什么东西进行校验,在这儿也记录一下。
12:07
这就是我们整个使用自定义校验的过程。当然,如果另外一种情况,比如我们在给我们的NT里边。我们哪一天受status这个字段可能是一个double类型的值了,那我们这个list value,它的这个校验器是只来校验我们这个inte的,所以有可能就没法使用了,那怎么办呢?我们就需要再来编写一个校验器,我们只需要在绿色value上指定我们这个可以使用多个校验器,它或者它或者它。那它就可以适配很多种不同的类型,那举一个例子,我们有这么一些校验器,我们打开concentrate value的整个实现,它的这个实现呢,我们会发现下边是这么写的,比如有negative value for bit,还有negative value for number就时他会对不同的类型都进行校验。
13:03
我们这个校验器啊,一个是泛型式BY还是这个校验注解,而另外一个呢。还是这个校验注解,但是它可以校验number,比如说一个校验注解可以由多个校验器同时工作,它会自动适配,我们这个注解被标注在了哪个类型属性上,就使用这个类型的校验器,我们在这儿来记录一下,也就是说在这一块可以指定,可以指定多个不同的校验器。适配不同类型的校验。同一个校验注解可以自动的使用不同的校验器进行校验,那至此呢,我们整个数据校验就说完了,它的基本功能,分组校验、自定义校验的高级功能我们也都使用了,我们后来在项目里边一定会进行前端与后端的双端校验,后端我们就使用GSR、303这些方式完成数据校验,保证我们最终提交给我们后台数据库的这些字段是经过校验了的。
14:09
那这样呢,我们来做一个整体的测试,我们来到我们的前端界面,我们现在校验功能都写好了,除了前端会来校验,我们后台还会校验,比如我们来新增的时候,我们来添加一个品牌名,我随便先写一个,我们来上传一张图片。介绍我们来写上一下,包括它的显示状态,检索首字母,我写一个A排序,我们来F12看控制台,我来点击确定。他说这个排序字段必须填写,那我们把它删了,再来写一个零确定,这个前端校验他认为是错误的,我们写一个一,那我们可能呢,把这个判断为零的,这个规则我们前端没写好,就先放在这吧,我们点一个确定。我们发现呢,他给我们返回参数格式校验失败,我们来看一下这个效果,他说这个检索首字母必须是一个字母,我们确定是一个字母。
15:05
我们来看一下我们后台编写的我们这个校验规则,Brand entity,好,我们在这,哦对了,我们这个在Java里边来写正则的时候,我们在这儿指定正则的时候,前后这两个是不需要的。我们来重新启动。再来测试一下,将之前的我们先来清空,那现在来准备提交,我点击确定。现在是系统未知异常,来看一下是什么未知异常。现在是no说没有一个校验器。被找到指定为double。我们刚才在演示list value的时候,我们将它变成了double,那我们默认的这个校验器只能校验integer的,所以我们把它还是返回成它默认的数据。好,我们来重新启动。再来测试,那现在来新增的时候,我先清空掉之前的数据,我们来点击确定。
16:03
诶,我们发现这一块呢,操作成功,包括我们这一块响应也是message success0没问题,那么添加也是没问题的,那么再来测试一下我们之前其他的功能,比如修改这个状态,这也是一个修改,我点一个修改,我们这说状态更新成功来看两百两百,我们发现还是参数格式校验失败,我们这个品牌名必须提交好,我们这个修改呢,只是修改它一个显示状态。我们这个品牌名字是不修改的,而我们这修改的时候还给它验证,必须提交,我们就可以把它删掉,但是如果这样删,那真正的修改功能相当于就允许前端去来传入内时空的字段,我们不允许将品牌制空。那这怎么做呢?究其原因就是我们在这进行修改的时候,将修改我们的显示状态和修改整个完整信息,我们都合并成了一个方法,所以我们可以专门提取另外一个方法,那么这个呢,只是修改它的status,快速修改它的状态的。
17:06
我们在这来说一下,这是来修改状态。包括我们在这儿可以来指定我们这是一个修改状态的这这一组,所以我们在这儿再来多添一个我们的分组接口,那在这来指定一个after status,当修改状态的时候呢。我们只能。去来校验品牌ID和品牌的。显示状态,它加上group shift f6,我统一呢都加上group,好们在这呢,来重新修改一下,我们就叫update status,还是提交这个数据,只不过我们使用update status组的。而这一组呢,我们就在B里边进行配置,在这一组啊,只来判断我们的受status对不对,那么这个除了添加,我们还要加上在update status group的时候,我们需要进行判断。
18:11
而且呢,他也不能为空,那再来加上一个约束,叫not nu。Groups是我们添加和修改状态的时候都不能为空。我们在这改了以后呢,重新启动一下,并且将前端项目修改状态,我们变为发送update status请求来到品牌brand brand呢我们在这修改状态,我们主要是在列表里边这有个show status。我们会调用update status这个方法,我们来到这,这是update,我们再来加一个叫status。我们只提交品牌的ID和status保存。现在再来进行调试,把这一块呢,我们先清空掉。
19:01
我们来给它关掉。那状态更新成功在这一块,哎,也没有那个错误提示了,打开。那我们现在也是成功没有错误提示的,那么再来测试这一块的修改。那这个修改呢,我们如果在这儿不带东西,首先前端就过不去,而如果我们都来带上,我们来点一个确定,我们看到操作成功也都是没问题的,包括大家可以使用postman再来进行测试,只带某些部分字段,如果还有什么小问题呢,大家也可以在这继续修改。那么整个品牌的功能就完成了。
我来说两句