前⾔
做web开发有⼀点很烦⼈就是要校验参数,基本上每个接⼝都要对参数进⾏校验,⽐如⼀些格式校验 ⾮空校验都是必不可少的。如果参数⽐较少的话还是容易 处理的⼀但参数⽐较多了的话代码中就会出现⼤量的IF ELSE就⽐如下⾯这样:
这个例⼦只是校验了⼀下空参数。如果需要验证邮箱格式和⼿机号格式校验的话代码会更多,所以介绍⼀下validator通过注解的⽅式进⾏校验参数。什么是Validator
Bean Validation是Java定义的⼀套基于注解的数据校验规范,⽬前已经从JSR 303的1.0版本升级到JSR 349的1.1版本,再到JSR 380的2.0版本(2.0完成于2017.08),已经经历了三个版本 。在SpringBoot中已经集成在 starter-web中,所以⽆需在添加其他依赖。
注解介绍validator内置注解注解详细信息@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)
被注释的元素必须符合指定的正则表达式Hibernate Validator 附加的 constraint注解详细信息@Email
被注释的元素必须是电⼦邮箱地址@Length
被注释的字符串的⼤⼩必须在指定的范围内@NotEmpty
被注释的字符串的必须⾮空@Range
被注释的元素必须在合适的范围内@NotBlank
验证字符串⾮null,且长度必须⼤于0注意:
@NotNull 适⽤于任何类型被注解的元素必须不能与NULL
@NotEmpty 适⽤于String Map或者数组不能为Null且长度必须⼤于0
@NotBlank 只能⽤于String上⾯ 不能为null,调⽤trim()后,长度必须⼤于0使⽤
使⽤起来也⾮常简单,下⾯略过创建项⽬模拟⽤户注册封装了⼀个UserDTO
当提交数据的时候如果使⽤以前的做法就是IF ELSE判断参数使⽤validator则是需要增加注解即可。例如⾮空校验:
然后需要在controller⽅法体添加@Validated不加@Validated校验会不起作⽤然后请求⼀下请求接⼝,把Email参数设置为空参数:
{
\"userName\":\"luomengsun\ \"mobileNo\":\"11111111111\ \"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}$\⼿机号格式有误\") @Max(value = 11,message = \"⼿机号只能为{max}位\") @Min(value = 11,message = \"⼿机号只能为{min}位\") private String mobileNo;
查看⼀下运⾏结果传⼊参数:
{
\"userName\":\"luomengsun\ \"mobileNo\":\"111111a\ \"sex\":1, \"age\":21,
\"email\":\"1212121\"}
返回结果:
{
\"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注解即可验证,在运⾏时触发,本⽂不对⾃定义注解做过多的解释,下篇⽂章介绍⾃定义注解
message 提⽰信息groups 分组
payload 针对于Bean
然后添加IdCardValidator 主要进⾏验证逻辑
上⾯调⽤了is18ByteIdCardComplex⽅法,传⼊参数就是⼿机号,验证⾝份证规则⾃⾏百度然后使⽤
@NotNull(message = \"⾝份证号不能为空\") @IdCard(message = \"⾝份证不合法\") private String IdCardNumber;
分组
就⽐如上⾯我们定义的UserDTO中的参数如果要服⽤的话怎么办?在重新定义⼀个类然后⾥⾯的参数要重新添加注解?Validator提供了分组⽅法完美了解决DTO服⽤问题
现在我们注册的接⼝修改⼀下规则,只有⽤户名不能为空其他参数都不进⾏校验先创建分组的接⼝
public interface Create extends Default {}
我们只需要在注解加⼊分组参数即可例如:
/**
* ⽤户名 */
@NotBlank(message = \"⽤户姓名不能为空\ @NotNull(message = \"⽤户姓名不能为空\ private String userName;
@NotBlank(message = \"邮箱不能为空\ @NotNull(message = \"邮箱不能为空\ @Email(message = \"邮箱格式错误\ 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注解,注意不是增加在参数前⾯。以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
因篇幅问题不能全部显示,请点此查看更多更全内容