SpringBoot如何优雅的校验参数?

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

阅读推荐:

一只Tom猫:一下子拿下23种策略模式:源码 应用情景 案例 解决方案 招聘面试必需!一只Tom猫:三次阿里巴巴三生三世凉凉后,半个月密闭式备考,总算追上了“腾讯官方”末班!

序言

  做web开发有一点很讨厌便是要校验参数,大部分每一个插口必须对参数开展校验,例如一些格式校验 非空校验全是不可或缺的。假如参数较为少得话還是非常容易 解决的一但参数比较多了得话编码中便会出現很多的IF ELSE就例如下边那样:

  这一事例仅仅校验了一下空参数。假如必须验证邮箱格式和手机号码格式校验得话编码会大量,因此 介绍一下validator根据注解的方法开展校验参数。

01 什么叫Validator

  Bean Validation是Java界定的一套根据注解的数据信息校验标准,现阶段早已从JSR 303的1.0版本升級到JSR 349的1.1版本,再到JSR 380的2.0版本(2.0进行于2017.08),早已经历了三个版本 。在SpringBoot中早已集成化在 starter-web中,因此 不用在加上别的依靠。


02 注解详细介绍

2.1 validator内嵌注解

2.2 Hibernate Validator 额外的 constraint

  留意

  • @NotNull 适用一切种类被注解的原素务必不可以与NULL
  • @NotEmpty 适用String Map或是二维数组不可以为Null且长短务必超过0
  • @NotBlank 只有用以String上边 不可以为null,启用trim()后,长短务必超过0

03 应用

  应用起來也比较简单,下边忽略建立新项目
GITHUB详细地址:

仿真模拟会员注册封裝了一个UserDTO
当递交数据信息的情况下假如应用之前的作法便是IF ELSE分辨参数应用validator则是必须提升注解就可以。

  比如非空校验:

  
随后必须在controller方式体加上@Validated不用@Validated校验会失灵

  
随后要求一下要求插口,把Email参数设定为空
参数:

  { "userName":"luomengsun", "mobileNo":"#34;, "sex":1, "age":21, "email":""}

  回到結果:

  后台管理抛出异常

  
那样是能校验取得成功,可是有一个难题便是回到参数并不理想化,前端开发也并不易解决回到参数,因此 大家加上一下全局性错误处理,随后加上一下全局性统一回到参数那样较为标准。

04 加上全局性出现异常

  建立一个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 早已对出现异常开展解决。

05 校验格式

  假如要想校验电子邮箱格式或是手机号码得话也比较简单。

5.1 校验电子邮箱

   /**

   * 电子邮箱

   */

   @NotBlank(message = "电子邮箱不可以为空")

   @NotNull(message = "电子邮箱不可以为空")

   @Email(message = "电子邮箱格式不正确")

   private String email;

5.2 应用正则表达式校验手机号码

  校验手机号码应用正则表达式开展校验,随后限定了一下十位数

   /** * 手机号码 */ @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}

  这儿已不验证手机号的事例

06 自定注解

  上边的注解仅有这么多,如果有独特校验的参数我们可以应用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方式,传到参数便是手机号码,认证身份证规则自主百度搜索:seenoevil:

  随后应用

   @NotNull(message = "身份证号码不可以为空") @IdCard(message = "身份证件不合理合法") private String IdCardNumber;

07 排序

  就例如上边大家界定的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得话能够应用排序校验

08 校验单独参数

  在开发设计的情况下一定遇到过单独参数的状况,在参数前边再加上注解就可以

  @PostMapping("/get")

   public ReturnVO getUserInfo(@RequestParam("userId") @NotNull(message = "客户ID不可以为空") String userId){

   return new ReturnVO().success();

   }

  随后在Controller类上边提升@Validated注解,留意并不是提升在参数前边。

创作者:乱写代码
全文连接:https://f265da33b
the end
免责声明:本文不代表本站的观点和立场,如有侵权请联系本站删除!本站仅提供信息存储空间服务。