• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

Spring-Validation 后端数据校验的实现

java 搞代码 4年前 (2022-01-09) 28次浏览 已收录 0个评论

前言

最近看到很多童鞋在项目中的对请求参数的校验都用的if来判断各参数的属性,如:

if(StringUtils.isBlank(username)){
  return RR.exception("账号不能为空");
}

if(StringUtils.isBlank(password)){
  return RR.exception("密码不能为空");
}

if(StringUtils.isBlank(realName)){
  return RR.exception("姓名不能为空");
}
......

每个参数都需要这样一个个去校验null,返回对应信息,代码就像叠罗汉一样~~,在此,楼主强烈推荐一个神器:Validation,有了它,再也不用这样去校验参数啦,可以让我们在项目中不用太关注其他东西,专注于业务逻辑的编写。

引入核心依赖

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

使用示例-添加用户

需要校验的实体类,在此使用了一些常用的校验注解,基本上能够见名知意,每个注解中都有message属性,就是校验不通过后的提示信息

@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(value = "Account", description = "用户实体类")
public class Account implements Serializable {

  private static final long serialVersionUID = -631033173072<mark style="color:transparent">本文来源gaodaimacom搞#^代%!码网@</mark>1778951L;
  
  private Long id;

  @NotBlank(message = "用户名不能为空")
  @Length(max = 10, message = "用户名最长为10位")
  private String name;

  @Pattern(regexp = PatternUtil.PASSWORDREGEX, message = "密码为6-20位数字加字母组合")
  private String pwd;

  @NotBlank(message = "姓名不能为空")
  @Length(max = 8, message = "姓名最长为8位")
  private String realName;

  @Pattern(regexp = PatternUtil.PHONENOREGEX, message = "手机号码格式不正确")
  private String phone;

  @NotNull(message = "用户性别不能为空")
  @Max(value = 1,message = "性别 0:男 1:女")
  @Min(value = 0,message = "性别 0:男 1:女")
  private Integer sex;
  
  @NotNull(message = "用户状态不能为空")
  @Max(value = 1,message = "用户状态 0:启用 1:禁用")
  @Min(value = 0,message = "用户状态 0:启用 1:禁用")
  private Integer status;

  @Length(max = 200, message = "备注最长为200个字符")
  private String rmk;
}
 

controller接口,注意在接收参数前需加上@Validated注解,这样就会逐个去校验实体类中需要加了校验注解的的属性,完全通过才进入下一步业务处理,否则抛出MethodArgumentNotValidException异常,在这里我们直接将异常抛出,交给全局异常处理类来处理。

@SysLog(menu = "用户管理", function = "添加",filterParams = {"pwd","password","salt"})
@PermissionCheck("account:manager:add")
@PostMapping(value = "/add", produces = BaseConsts.REQUEST_HEADERS_CONTENT_TYPE)
@ApiOperation(value = "用户管理-添加用户接口", notes = "用户管理-添加用户接口", httpMethod = BaseConsts.REQUEST_METHOD, response = RR.class)
public RR add(@Validated @RequestBody Account account) throws Exception {
  return RR.success("添加用户成功");
}

声明全局异常处理类,处理所有异常,可以随业务需要将异常种类细分,返回错误码,返回提示信息可自由定义…   这里只需关注MethodArgumentNotValidException异常。

@RestControllerAdvice
public class GlobalExceptionHandle {

  /**
   * @param e
   * @return
   * @Description 未知异常处理
   */
  @ExceptionHandler(Exception.class)
  public RR handleException(Exception e) {
    e.printStackTrace();
    return RR.exception("系统异常,请联系管理员");
  }
  

  /**
   * @param e
   * @return
   * @Description 请求参数异常
   */
  @ExceptionHandler(MethodArgumentNotValidException.class)
  public RR handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
    return RR.exception("请求参数错误:[" + e.getBindingResult().getFieldError().getDefaultMessage() + "]");
  }
  

  /**
   * @param e
   * @return
   * @Description 系统业务服务异常
   */
  @ExceptionHandler(ServerException.class)
  public RR handleServerException(ServerException e) {
    return RR.exception(e.getMessage());
  }
  

  /**
   * @param e
   * @return
   * @Description 令牌校验异常
   */
  @ExceptionHandler(ExpireException.class)
  public RR handleExpireException(ExpireException e) {
    return RR.expire(e.getMessage());
  }
  

  /**
   * @param e
   * @return
   * @Description 无权访问异常
   */
  @ExceptionHandler(AccessDeniedException.class)
  public RR handleAccessDeniedException(AccessDeniedException e) {
    return RR.forbidden(e.getMessage());
  }
  

  /**
   * @param e
   * @return
   * @Description 自定义重复操作异常
   */
  public RR handleRepeatHandleException(RepeatHandleException e) {
    return RR.exception("您的请求已发送,请勿重复操作!");
  }

  /**
   * @param e
   * @return
   * @Description 登录异常处理
   */
  @ExceptionHandler(AuthenticationException.class)
  public RR handleAuthenticationException(AuthenticationException e) {
    return RR.exception(e.getMessage());
  }
}

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Spring-Validation 后端数据校验的实现

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址