做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
中,因此 不用在加上别的依靠。
留意:
应用起來也比较简单,下边忽略建立新项目
GITHUB详细地址:
仿真模拟会员注册封裝了一个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
方式,传到参数便是手机号码,认证身份证规则自主百度搜索:seenoevil:
随后应用
@NotNull(message = "身份证号码不可以为空") @IdCard(message = "身份证件不合理合法") private String IdCardNumber;
就例如上边大家界定的UserDTO中的参数假如要服食得话该怎么办?
在彻底改变一个类随后里边的参数要再次加上注解?
Validator
出示了排序方式极致了处理DTO服食难题
如今大家申请注册的插口改动一下标准,仅有登录名不可以为空别的参数也不开展校验
先建立排序的插口
public interface Create extends Default { }
大家只必须在注解添加排序参数就可以比如:
/** * 登录名 */ @NotBlank(message = "客户名字不可以为空",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
注解,留意并不是提升在参数前边。
创作者:乱写代码
全文连接:https://f265da33b