让你的代码更加简练,springboot使用JSR303校验

2020-05-28 00:00:00 异常 注解 默认 校验 验证


痛点



相信不少人写过这样都代码,对方法入参进行了各种校验。上面还是比较少的校验。如果遇到什么邮箱、手机号更复杂,对格式也需要进行校验。可能洋洋洒洒几百行代码就过去了。这种代码其实跟业务流程没有太多关系,但是又不能不做。那么有没有一种方法可以避免呢。当然有!就是JSR-303(JSR是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求,是Java界的一个重要标准)校验规范。


JSR-303


JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean Validation,官方的参考实现是Hibernate Validator。需要注意的是此实现与 Hibernate ORM 没有任何关系。JSR 303 用于对 Java Bean 中的字段的值进行合法性验证。Spring MVC 3.x 开始支持 JSR-303,可以在控制器中对提交的数据进行JSR-303验证。 把验证交给框架,让我们更专注于业务 。常用的规则如下:




springboot中JSR的使用


默认springboot集成了 hibernate-validator,而且默认是生效的,可以直接使用。默认不支持基础类型的验证,必须配置拦截器MethodValidationPostProcessor,在Controller类上加 @Validated注解可以实现对方法参数的校验。而且默认只验证 controller 方法上的 validator 注解,而不会验证 controller 层以外的。所以,如果要在其他层使用 validator 验证的话,需要单独配置拦截器.


如果验证对象是java Bean,就更好操作了,我们下面走一个完整的springboot例子,

先构建一个需要校验的java Bean,通过JSR-303的校验注解进行对应的操作,如下



在springmvc接口中 像下面一样增加一个@Valid 注解就行了


这里可能你产生了疑问,如果校验失败我们怎么办?不知道你是否了解springboot 统一异常处理

(通过@ControllerAdvice 声明一个全局异常类)我们可以通过统一拦截处理校验异常把上面注解中的的message信息返回给前端。值得注意的是,如果你前台传入的参数不在body中,校验失败抛出BindException异常,如果接口方法的参数有@RequstBody 注解,即参数放在body中传输,会抛出MethodArgumentNotValidException 异常,分别加以处理即可。样例如下




如果上面的不满足需要,我们还可以对hibernate-validator 进行扩展,甚至可以实现fail-fast 机制(当有错误时剩下的都不再进行校验立即失败)。这个留给你自己探索发现。上面的可以应付大多数场景,而且如果配合lombok 神器 你的代码会更加清晰简练。


相关文章