SpringBoot如何优雅的校验参数

JAVA 2023-07-05 17:29:38
76阅读

序言

  做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":"#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注解就可以认证,在运作时开启,文中不对自定注解做过少的表述,下一篇文章详细介绍自定注解

  • message 信息提示
  • groups 排序
  • payload 对于于Bean

  随后加上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如何优雅的校验参数| 乱敲代码

the end
免责声明:本文不代表本站的观点和立场,如有侵权请联系本站删除!本站仅提供信息存储空间服务。