做web开发有一点很讨厌便是要校验主要参数,大部分每一个插口必须对主要参数开展校验,例如一些文件格式校验 非空校验全是不可或缺的。假如主要参数较为少得话還是非常容易 解决的一但主要参数比较多了得话编码中便会出現很多的IF ELSE
就例如下边那样:
这一事例仅仅校验了一下空主要参数。假如必须认证邮箱格式和手机号格式校验得话编码会大量,因此 介绍一下validator
根据注解的方法开展校验主要参数。
Bean Validation是Java界定的一套根据注解的数据信息校验标准,现阶段早已从JSR 303的1.0版本升級到JSR 349的1.1版本,再到JSR 380的2.0版本(2.0进行于2017.08),早已经历了三个版本 。在SpringBoot
中早已集成化在 starter-web
中,因此 不用在加上别的依靠。
注解
详细资料
@Null
被注释的元素务必为 null
@NotNull
被注释的元素务必不以 null
@AssertTrue
被注释的元素务必为 true
@AssertFalse
被注释的元素务必为 false
@Min(value)
被注释的元素务必是一个数据,其值务必高于或等于特定的极小值
@Max(value)
被注释的元素务必是一个数据,其值务必不大于特定的最高值
@DecimalMin(value)
被注释的元素务必是一个数据,其值务必高于或等于特定的极小值
@DecimalMax(value)
被注释的元素务必是一个数据,其值务必不大于特定的最高值
@Size(max, min)
被注释的元素的尺寸务必在特定的范畴内
@Digits (integer, fraction)
被注释的元素务必是一个数据,其值务必在可接纳的范畴内
@Past
被注释的元素务必是一个以往的时间
@Future
被注释的元素务必是一个未来的时间
@Pattern(value)
被注释的元素务必合乎特定的正则表达式
注解
详细资料
@Email
被注释的元素务必是电子器件邮件地址
@Length
被注释的字符串数组的尺寸务必在特定的范畴内
@NotEmpty
被注释的字符串数组的务必非空
@Range
被注释的元素务必在适合的范畴内
@NotBlank
认证字符串数组非null,且长短务必超过0
留意:
仿真模拟会员注册封裝了一个UserDTO
当递交数据信息的情况下假如应用之前的作法便是IF ELSE
分辨主要参数应用validator
则是必须提升注解就可以。
比如非空校验:
随后必须在controller
方式体加上@Validated
不用@Validated
校验会失灵
随后要求一下要求插口,把Email基本参数为空
主要参数:
{ "userName":"luomengsun", "mobileNo":"#34;, "sex":1, "age":21, "email":""}复制代码
回到結果:
后台管理抛出异常
那样是能校验取得成功,可是有一个难题便是回到主要参数并不理想化,前端开发也并不易解决回到主要参数,因此 大家加上一下全局性错误处理,随后加上一下全局性统一回到主要参数那样较为标准。
建立一个GlobalExceptionHandler
类,在类上边加上@RestControllerAdvice
注解随后加上下列编码:
/** * 方式主要参数校验 */@ExceptionHandler(MethodArgumentNotValidException.class)public ReturnVO handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { log.error(e.getMessage(), e); return new ReturnVO().error(e.getBindingResult().getFieldError().getDefaultMessage()); }复制代码
此方式关键捕获MethodArgumentNotValidException
出现异常随后对出现异常結果开展封裝,假如必须在填加别的错误处理。
加上完以后我们在看一下运作結果,启用插口回到:
{ "code": "9999", "desc": "电子邮箱不可以为空", "data": null}复制代码
OK 早已对出现异常开展解决。
假如要想校验邮箱格式或是手机号码得话也比较简单。
/** * 电子邮箱 */ @NotBlank(message = "电子邮箱不可以为空") @NotNull(message = "电子邮箱不可以为空") @Email(message = "邮箱格式不正确") private String email;复制代码
校验手机号码应用正则表达式开展校验,随后限定了一下十位数
/** * 手机号码 */ @NotNull(message = "手机号码不可以为空") @NotBlank(message = "手机号码不可以为空") @Pattern(regexp ="^[1][3,4,5,6,7,8,9][0-9]{9}$", message = "手机号格式不正确") @Max(value = 11,message = "手机号码只有为{max}位") @Min(value = 11,message = "手机号码只有为{min}位") private String mobileNo;复制代码
查询一下运作結果
传到主要参数:
{ "userName":"luomengsun", "mobileNo":"", "sex":1, "age":21, "email":"#34;}
回到結果:
{ "code": "9999", "desc": "邮箱格式不正确", "data": null}
这儿已不验证手机号的事例
上边的注解仅有这么多,如果有独特校验的主要参数我们可以应用Validator
自定注解开展校验
最先建立一个IdCard
注解类
@Documented@Target({ElementType.PARAMETER, ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)@Constraint(validatedBy = IdCardValidator.class)public @interface IdCard { String message() default "身份证号不合理合法"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {};}
在UserDTO中加上@IdCard
注解就可以认证,在运作时开启,文中不对自定注解做过少的表述,下一篇文章详细介绍自定注解
随后加上IdCardValidator
关键开展认证逻辑性
上边启用了is18ByteIdCardComplex
方式,传到主要参数便是手机号码,认证身份证规则自主百度搜索
随后应用
@NotNull(message = "身份证号码不可以为空") @IdCard(message = "身份证件不合理合法") private String IdCardNumber;
就例如上边大家界定的UserDTO中的主要参数假如要服食得话该怎么办?
在彻底改变一个类随后里边的主要参数要再次加上注解?
Validator
出示了排序方式极致了处理DTO服食难题
如今大家申请注册的插口改动一下标准,仅有登录名不可以为空别的主要参数也不开展校验
先建立排序的插口
public interface Create extends Default {}
大家只必须在注解添加排序主要参数就可以比如:
/** * 登录名 */ @NotBlank(message = "客户名字不可以为空",< /span>groups = Create.class) @NotNull(message = "用户姓名不能为空",groups = Create.class) private String userName; @NotBlank(message = "邮箱不能为空",groups = Update.class) @NotNull(message = "邮箱不能为空",groups = Update.class) @Email(message = "邮箱格式错误",groups = Update.class) private String email;
然后在修改Controller在@Validated
中传入Create.class
@PostMapping("/user") public ReturnVO userRegistra(@RequestBody @Validated(Create.class) UserDTO userDTO){ ReturnVO returnVO = userService.userRegistra(userDTO); return returnVO ; }
然后调用传入参数:
{ "userName":"",}
返回参数:
{ "code": "9999", "desc": "用户姓名不能为空", "data": null}
OK 现在只对Create的进行校验,而Updata组的不校验,如果需要复用DTO的话可以使用分组校验
在开发的时候一定遇到过单个参数的情况,在参数前面加上注解即可
@PostMapping("/get") public ReturnVO getUserInfo(@RequestParam("userId") @NotNull(message = "用户ID不能为空") String userId){ return new ReturnVO().success(); }
然后在Controller类上面增加@Validated
注解,注意不是增加在参数前面。
转自:SpringBoot如何优雅的校验参数| 乱敲代码