SpringBoot使用JSR303参数校验
开发web项目有时候我们需要对controller层传过来的参数进行一些基本的校验,比如非空,非null,整数值的范围,字符串的个数,日期,邮箱等等。最常见的就是我们直接写代码校验,这样以后比较繁琐,而且不够灵活。 不能总是写繁琐的代码来实现吧。
使用JSR303来做参数校验就方便并且整洁很多了。
pop引入依赖
1 | <!--JSR303校验的依赖--> |
Controller中使用
1 | "/login") ( |
校验实体
1 | package com.springboot.SecKill.vo; |
自定义校验
JSR303中给我们定义了一些常用的校验注解,如本文最后常用常用注解中所示,但是要是还不能满足学习怎么去自己定义注解呢?
参照@NotNull这个校验注解的定义方法,@NotNull是这么定义的
1 | // |
参照上面,我们实现自己的注解
1 | package com.springboot.SecKill.validator; |
实现具体校验器
上面只是实现了自己定义的校验器的接口,具体的实现类如下:
1 | package com.springboot.SecKill.validator; |
异常处理
参数校验不通过就会产生错误信息,显示一大串例如
1 | {"timestamp":"2018-08-02T13:07:50.890+0000","status":400,"error":"Bad Request","errors":[{"codes":["IsMobile.loginVo.mobile","IsMobile.mobile","IsMobile.java.lang.String","IsMobile"],"arguments":[{"codes":["loginVo.mobile","mobile"],"arguments":null,"defaultMessage":"mobile","code":"mobile"},true],"defaultMessage":"手机号码格式错误","objectName":"loginVo","field":"mobile","rejectedValue":"22111111111","bindingFailure":false,"code":"IsMobile"}],"message":"Validation failed for object='loginVo'. Error count: 1","path":"/login/do_login"} |
为了方便查看,统一进行异常处理
1 | package com.springboot.SecKill.exception; |
全局的异常处理
上面的知识参数检验时候的异常处理,但是在工程中很多的异常,用全局的异常处理更加方便维护。
首先定义一个全局的异常
1 | package com.springboot.SecKill.exception; |
然后在全局异常处理器中添加这个全局的异常,也就是在GlobalExceptionHandler类中添加
1 | if(e instanceof GlobalException){ |
然后在产生异常的地方直接抛出全局异常就可以了
1 | if (loginVo == null){ |
CodeMsg.SERVER_ERROR是自己定义的异常信息。
常用注解
1 | null 被注释的元素必须为 |