00:00
前边我们测试了前端的表单校验功能,那这提交来的数据呢,我们后台还要再做一次验证,我们接下来说后端校验,那这个后端校验呢,主要我们使用GSR303的功能,GSR也就是Java规范提案第303号,它规定了数据校验相关的标准,那我们想要使用GSR303其实也是非常简单的,在我们spring BOO应用里边,首先我们做的第一步,我们给需要校验的数据加上校验注解,给咱们这个B添加校验注解,比如我们这个品牌的新增,最终我们会将品牌的这些数据提交上来,那我们就需要给品牌,那么这个主要是brand ntt,给他添加上校验注解,那校验注解呢有非常多,比如来给大家找一下,比如an email,它的意思就是它标注的字段必须是一个邮箱。再比如。
01:00
Ant not not这个注解标注的字段呢,就必须不能为空等等等等,这些校验注解我们全可以在这个Java X validation这个包里边,我们看到就有这么多的校验注解,比如future,我们标注的字段必须是一个未来的时间,比如我们还可以给它规定有多大有多小不能为空,包括长度约束等等等等,所以呢,我们先做第一步,我来标注校验注解,比如第一个校验注解,我们要添加品牌,品牌名就不能为空,那我们可以标注第一个叫not not,这是不能为空,但我们还有一个叫not empty,这也是不能为空,那它们之间的区别,我们来可以看一下,Not empty呢,他说我们标注的这个元素啊,必须不是空的,或者呢,这种empty空创,那我们品牌的名字呢,我们其实可以标注一个叫note blank,这也是不能为空,但是他的意思是。
02:01
我们标注的这个东西必须包含至少一个非空字符,也就是说不能是一个空格,至少得有一个非空格字符,所以我们这个比较合适。所以我们要做的第一步,给我们校验的字段标注校验注解,校验注解有一堆,全部可以参照这个包里面的校验注解,把copy reference复制过来,这是第一步,第二步。那标好校验注解以后,我们就要让spring mvc在提交数据的时候,我们发送请求会给controller,比如brand controller在新增的时候,我们会提交brand ntity在提交这个数据的时候呢,告诉spring mvc这个数据啊,需要校验,那如果不告诉,只是标了校验注解是没啥用的,只有我们在开启校验的时候呢,它才会校验,所以我们想要开启校验功能,只需要给我们这个B,我们标注一个注解,叫an valid。
03:04
这样呢,相当于告诉spring m VC,我们的这个字段是需要进行校验的,当这都是规范,Java X包下的spring mvc是支持的,那当我们标注了这个校验注解以后,我们再来保存数据,那它就会进行校验,那我们没标校验注解,我们只是在这儿标了规则是默认不启用的,我们可以来进行一个测试,我们重新启动我们的商品服务,我们现在给品牌的新增标了校验注解,同时我们在postman里边,我们来测试一下品牌的新增。现在我们是product brand,我们调用save方法,Save方法呢,我们body里边提交数据,我们新增一个品牌,那ID不用填,我们现在假设给他提交一个name为空的,我们现在约束了name不为空,那我们给他给一个name,我们现在假设是一个空串,我们看会有什么样的效果,现在我们绕过了我们前端的页面,我们来提交,我点一个send。
04:04
诶,我们发现呢,现在这有一个400叫band request,只要以后我们看到响应状态码是400,那说明我们这个数据校验是不通过的,那不通过的原因在这个errors里边也都封装着它的错误代码,在这儿也有,包括还有一些其他信息,比如default message,那就是错误消息叫不能为空,以及是哪个字段,Failed是这个name字段发生的错误,以及它为什么发生错误,是因为它注入的这个值是一个空创所以导致的错误,所以这一块校验信息呢都会有,所以我们这个校验就简单完成了,只需要给它标注校验注解出问题,我们就会响应这些错误,但这些错误啊,不符合我们业务规定,我们业务以后规定,所有的返回都应该是这么一个对象,有code的,我们的状态码,还有message提示,还有data信息内容,包括我们出错以后,我们在data里边提示哪个字段发生了错误,错误消息提示是什么。我们。
05:05
想要这来做,包括它这的错误消息提示叫不能为空,什么不能为空呢?我们还可以自定义一些错误消息提示,我们可以在note blank里边,这个里边呢,可以自己来编写这个message提示,如果自己不编写它这一块default的意思是动态的,会取出有一个叫validation message properties里边的内容,我们可以给大家找一下这个文件。我们来找一下这个文件。这个文件呢,在这儿有定义,相当于在这些文件里边定义了发生错误以后该怎么提示,但这些文件呢,我们现在都是定义的是英文,而我们错误提示呢,是中文提示,来看一下,在这些文件里边,它有中文的提示杠,ZHCN,来找到他们,我们就会发现我们not not not empty以及not blank,在这一块就会有提示,不能为空,如果对这一块不满意了,我们还可以直接在这进行修改,我们给他message,如果我们这个字段出现了错误,我们告诉他我们就叫品牌名。
06:10
必须提交好,我们现在来测试一下,就生成了我们自定义的校验错误信息,当然我们也可以自己定义一个校验的配置文件,重新配置一下它里边的这些错误提示,我们现在来看一下这个效果。重新发送请求,我们现在的提示呢,就已经变成了品牌名必须提交了,所以我们想要开启校验,我们就只需要做的是添加校验注解,我们在这儿批注一下添加校验注解,并定义定义自己的message提示。然后呢,我们需要开启。校验功能,这个校验功能呢,需要一个注解,就是在需要校验的这个B上添加ant valid。
07:06
接下来它产生的效果就是校验错误以后会有默认的响应。这个响应的,那就长这个样,我刚才说了,这不满足我们业务需求,我们想自己获取到这些错误信息,给我们提示成我们整个R对象里边的东西,也就是code message以及错误消息,我们还可以这么做,想要感知到到底校验出错还是没出出错,我们可以在这儿使用一个参数。紧跟着校验属性,后边加一个叫帮ing result,一定要紧跟,前边是我们需要校验的对象,在后边这个帮ing result就封装了前面这个对象的校验结果,来给大家记录一下。第三个我们可以紧跟。
08:02
紧跟。给校验的B后,紧跟一个finding result就可以获取到校验的结果。我们拿到这个校验的结果,我们就可以自定义封装,比如来到这这个结果呢,我们判断它成功还是失败了,在result里边有一个叫汉字errors,也就是我们这次校验是不是有什么错误,我们可以在这判断,如果说有错误说明校验出错了,否则的话没有错误,那才做真正的事情。我们在这呢,给它保存数据,我们可以在这儿汉字as,那有错误,那有错误以后呢,我们让它响应的是一个错误消息r.error包括errorrow的错误码,比如我们也写一个400万错误消息的内容,我们就叫提交的数据不合法,到底是哪些数据不合法,我们希望将整个不合法的信息封装成一个map,这个map里边说明了哪个字段不合法。
09:13
不合法的错误提示是什么封装了?那我们想要获取这个怎么获取呢?我们最终希望把这个返回,那我们就可以在这获取校验的错误结果。那如何进行获取?从result对象里边有一个叫get field errors。这就是获取所有字段出现的校验错误信息,我们拿到它,把它呢进行一个遍历,我直接for each来写箭头函数,我们要遍历的每一个校验错误的元素,在这一块呢,每一个元素都是一个file的error,比如说字段错误,那我们从这个错误里边呢,我们可以拿到这些信息,首先第一个将get default messages,也就是说我们校验错了以后的错误提示消息,这个提示消息没配。
10:07
就是用我们说的默认的这些配置文件里边配的,那如果配了,那就是我们自己的,而我们在这儿校验注解上呢,我们已经写了我们自己的,所以我们配了,这是我们获取到的错误校验消息,获取到错误提示,接下来我们哪个字段出现错误呢?我们也可以得到这个字段,在item里边也封装了一个叫get field,这有一个字段名,获取错误的属性的名字,它是。内幕发生错误,还是logo错误,还是什么错误,我们在这呢也可以获取到,我们希望将整个这个封装成一个map,最终返回,比如我来写一个map string string,我们这个map呢,就是来封装我们的这些arrow的new,一个哈希map。
11:01
只要每提取到一对错误信息,我们就给它里边放P呢,那就是这个属性名,是这个属性发生了什么错误,那就是这个错误消息名,那最终放完以后,我们将这个map给它返回,当这个error方法定义的时候呢,没有这个传map参数的,我们来给它里边放一个点put put一个data data里边呢,就是我们这个map,那现在来看一下我们处理以后的结果,那么处理以后的错误返回,那就全业务都统一了,全部返回这个R对象,即使校验出错了,我们在这儿也能获取到校验出错的信息,我们现在来看一下效果,同样是这个保存,我点一个send。我们发现呢,我们状态码是400,信息提示是提交的数据不合法,但是到底是什么不合法,我们在这说了name,我们这个名字啊,是品牌名,必须提交,相当于有这个字段不合法。
12:02
那校验的其他东西,我们都只需要给这添加上相应的校验注解,比如我们这个logo,而且这个logo的校验注解,它呀必须是一个URL地址,这个怎么写呢?我们直接写一个URL,我们发现这也是一个校验注解,只不过它是harber net提供的GSR303是一个规范,那harber net呢,也提供了额外的一些实现,我们这个实现呢,就约定了它必须是一个URL地址,这个URL地址呢,包括错误消息,默认是取出这里面的错误消息的,当然我们给他一个自己定义的提示message,这个message址呢,就是我们这个logo。必须是一个。合法的URL地址以及介绍显示状态等等其他信息,而且特别注意我们在这检索首字母的时候,我们说这个字母啊,必须是一个A到Z,或者大写A到Z的一个字母规范,而我们这些自定义的规则呢,我们这就没有相关的校验注解了,但是我们有这么一个注解叫an pattern,所有自定义的一些规则都可以使用一个叫an pattern,这个pattern呢,我们里面可以传一个正则表达式,如我们啊规定你必须满足这个正则要求。
13:25
那这些特殊的,我们就可以自己来写正则表达式,那这个正则要求呢,那就是杠,我们必须以A到ZA到Z开头,或者大写的A到Z开头,并且以他们结束,就这么一个,我在这写了一个正则表达式,当校验失败以后呢,我们的message提示就是检索首字母必须是一个字母。另外我们的显示状态是我们自己允许的两个值,比如零和一,我们也可以写正则表达式,特别是呢这个排序排序啊,它是一个大于零的整数,那我们就可以在这标注另外一个注解面面就是最小,那我们这个东西啊,它最小是多少呢?我们给这指定一个Y6值。
14:14
那它的这个最小啊,它必须是零,你不能传低于零的其他数字,包括出现错误以后,给一个提示叫排序,必须必须大于等于零,这是我们后端的校验,注解们在这就写完了,我们来全体来测试一下,好,我们来到postman进行测试,如果我只提交了一个name,我们来点send。在这一块呢,就说name必须提交,那么来给name提交一个值,我们再来点send,我们这一块居然提交成功了,我们看一下我们写的有没有什么问题,诶我们来看一下这一块的最大问题,就是我们标了一个at URL,说这必须是一个合法的邮件地址,那如果我们提交了,那就必须合法,那不提交了,我们并没有约束他,不能为空,我们现在来看,现在这是一个没有提交状态,如果我们提交了不合法,那他会进行校验logo,我们提交一个不合法的,比如这叫ABC,它明显不是UR一个URL能send的。
15:16
我们发现呢,现在这个logo必须是一个合法的URL地址,所以我们还要加上非空判断的话,那我们就可以标注多个主解,比如not empty,它不能为空,而且呢,还必须是一个合法的UR地址,其他字段要没标not empty了,那就是我们没提交也可以,但如果提交了,他就要符合我们这种规则,那完整我们都给它标上。Note empty我们新增的时候呢,我们要求他们都不能为空来重新启动一下,现在来测试一下效果,我们来点击send翻译这呢提示说我们的这个thoughtt字段,它是一个不能用not empty进行约束,那我们就可以使用not not它不能是空的,我们在这儿来给它改掉notno。
16:08
这注解能标于哪些属性,能验证哪些类型的参数,我们都是要参照这一块文档的。我们看到这个not now,它可以接收任意类型的,而note empty,我们来看下它的文档,它在这儿支持的类型只是这些字符串集合,Map或者数组等等,重新启动进行测试,所以啊,这些都不用记,我们参照文档来做就行了。那现在来进行一个测试,点击send。我们请求发送出去,我们发现啊,现在三个字段都有问题,Sort不能是空,First letter也不能为空,Logo呢,必须是一个合法的URL地址,那至此我们基本的校验就做完了。
我来说两句