搜索
您的当前位置:首页正文

SpringBoot如何优雅的处理校验参数的方法

来源:哗拓教育
SpringBoot如何优雅的处理校验参数的⽅法

前⾔

做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[] 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注解,注意不是增加在参数前⾯。以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

因篇幅问题不能全部显示,请点此查看更多更全内容

Top