IoC容器,Bean校验,Hibernate Validator
2018-03-07 本文已影响19人
在路上phper
这节我们学习一下组件的验证,并且结合一些第三方组件进行学习 在我们常见开发中,如果我们传入一个参数,在spring mvc里面,这时候我们会对它进行验证(后面会学习)
接下来做一个简单的实体类
UserEntity用户实体 放在SpringLean.Users包下面(里面有一些字段和数据库字段相同或业务字段相同)
在实体类中可以存入一些业务数据 一般生成getter and setter 比如把用户id和用户名称放进去 然后再我们的业务当中就可以得到并且处理,那么这时候我们无脑的把它传入到方法当中,那我们在获取的时候,如果数据存在不合法或者出现违法字符,就会出现些问题,因此在做业务的时候,需要做些验证。
目录如下

代码如下

假设我们要验证实体中的年龄大小 用户名长度 等 我们可以取出属性进行正则表达式 或者字符长度的判断 这种方式效率很低,那么有没有什么通用的验证方法呢?
为了方便理解文档 我们在UserEntity中加入一个toStirng方法 是一个内置方法 对它进行重写 重写之后我们既可以在控制台中打印这个类
新增代码如下

接下来来到我们的MyTest1文件 由于我们在MySpring里面通过getBean的方法 获取了MyTest1
所以就可以在我们的IoC容器里面进行统一的调用和处理
接下来我们在MyTest1里面写一个测试方法

然后再UserEntity实体类中写入生成构造函数

接下来在MySpring中进行调用

运行结果

实际上我们要做的就是对以上参数进行验证
所以接下来我们学习一下验证的基本方法,今天暂时了解下套路,在我们以后的spring mvc中经常会用到
接下来我们看文档https://docs.spring.io/spring/docs/5.0.4.RELEASE/spring-framework-reference/core.html#validation
首先spring里面提供了一个Validator 接口
只要实现这个接口,就可以对它进行基本的简单的验证
下面做个最基本的演示
在SpringLean.Users包下面创建一个UserValidator 代表对用户进行验证
目录如下

根据官网 可知要继承Validator接口 alt+enter导入相关包后代码如下

这两个方法有什么作用呢?

supports代表我们当前的验证是否支持该Class的实例 这里我们可以写当前class是否是我们的UserEntity或者是否是继承某个接口,只要该方法返回true 那么validate方法就被执行了。如果出现错误,会把错误信息统一放入Error对象中
接下来看代码

写完验证代码 我们再次运行下MySpring

可以发现结果是一样的 我们的验证类没有起到作用
这是因为我们的UserEntity和UserValidator这两个没有任何关系产生
下面根据文档需要使用DataBinder对象,这时一个数据绑定,可以绑定我们的参数到指定对象中,并且可以做些修改,比如我们使用spring mvc时候,一旦得到表单参数,我们对它可以进行参数的绑定和验证

接着看官网https://docs.spring.io/spring/docs/5.0.4.RELEASE/spring-framework-reference/core.html#validation-beanvalidation

可以找到这样一段内容
我们在方法里自我创建 创建好之后把相关的类传进去 执行validate方法就可以把当前的validator产生的错误信息得到。
接下来写下代码
在MyTest1中修改下showUser方法
首先将UserValidator打入@Compoment注解 将其变为一个组件 然后再MyTest1中打入@AutoWired自动注入注解

再次运行MySpring
运行结果

那我们想看具体是什么原因导致的验证没通过怎么办呢?
需要对错误信息进行循环
接下来写下代码

运行结果

还可以直接获取自定义信息

运行结果

从结果看出验证貌似有用 在validator里面可以对我们的字段进行一个一个验证
但是会发现一个问题 如果有很多这样的实体类 那么是否需要创建很多个validator对里面的内容一个个进行验证呢?
那样太麻烦了
所以接下来学下下面的内容

来到官网 可以看见下面一段内容

JSR-303不是spring特有的,是bean验证的基本规范 实现该规范的有hibernate validator厂商 hibernate也是一个数据层框架
暂时先不学 我们可以在maven中直接使用hibernate 的验证器
来到hibernate验证器官方文档http://hibernate.org/validator/

通过实例可以看出 只要在类中打入注解就可以对我们的字段进行验证
下面我们加入hibernate validator的maven依赖
在pom.xml中加入

上面的依赖为hibernate本身的 它需要依赖下面的el表达式类库
接下来做个简单的演示
上面我们写了UserValidator类进行用户字段的验证 下面我们不用它了
如何对UserEntity进行验证呢
首先来到hibernate validator验证官网http://hibernate.org/validator/
来到UserEntity
加入注解

对age进行验证 打入注解 @NotNull不能为空 和最大值最小值设置
接下来来到MyTest1
注释掉userValidator这句 因为我们不用UserValidator这个类进行验证了 想使用注解的方式

这时我们运行下MySpring
发现结果又变为

说明注解没作用
接下来继续看spring文档
spring里面如何对bean进行验证
spring里面有个默认的验证器

我们用它可以进行bean的注册
写法有两种 1.xml文件2.注解的方式
这节课使用注解的方式演示下
根据文档 来到UserConfig文件
加入如下内容

然后来到MyTest1
加入自动引用注解 并引用localValidator

此时将MySpring中调用代码修改下

运行MySpring
结果

再次修改调用参数

运行结果

以上就是最简单的验证 下节课我们学习下自定义验证规则