通过spring-boot validation对参数校验并封装全局异常处理类

文章介绍了如何在SpringBoot项目中使用validation进行参数校验,包括添加依赖、注解使用方法以及创建全局异常处理类来捕获和处理验证异常。示例代码展示了LoginRequest实体类的校验规则,Controller层的参数校验,以及GlobalException类的异常处理逻辑。
摘要由CSDN通过智能技术生成

通过spring-boot validation对参数校验并封装全局异常处理类

1.通过maven引入导入依赖

 <!--  参数校验-->
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-validation</artifactId>
 </dependency>

2.通过注解的方式对参数增加验证条件

import lombok.Data;
import org.hibernate.validator.constraints.Length;

import javax.validation.constraints.NotBlank;
import java.io.Serializable;

/**
 *Author  wwk
 * Date  2023/6/29 22:55
 */

@Data
public class LoginRequest implements Serializable {
    private static final long serialVersionUID = 4001157484090646820L;

    @NotBlank(message = "用户名不能为空")
    @Length(min = 5,max = 15,message = "账号长度在5-15位之间")
    private String username;
    @NotBlank(message = "密码不能为空")
    @Length(min = 6,max = 15,message = "密码长度在6-15位之间")
    private String  password;
}

所有验证的注解 及解释

序号注解解释
1@NotNull验证对象不能为null。
2@NotBlank验证字符串不能为null、空字符串或只包含空格。
3@NotEmpty验证字符串、集合或数组不能为null且必须有元素。
4@Size验证字符串、集合或数组的大小必须在指定范围内。
5@Min验证数字必须大于等于指定的最小值。
6@Max验证数字必须小于等于指定的最大值。
7@DecimalMin验证数字必须大于等于指定的最小值,支持小数。
8@DecimalMax验证数字必须小于等于指定的最大值,支持小数。
9@Pattern验证字符串必须匹配指定的正则表达式。
10@Email验证字符串必须是一个有效的电子邮件地址。
11@Length验证字符串的长度必须在指定范围内。
12@Range验证数字必须在指定范围内。
13@Digits验证数字必须是指定位数的整数或小数。
14@Positive验证数字必须为正数。
15@Negative验证数字必须为负数。
16@Past验证日期必须在当前时间之前。
17@Future验证日期必须在当前时间之后。

3.通过controller接收到的参数进行验证

通过@Validated注解对传来的参数进行校验

  @PostMapping("/login")
    public R doLogin(@RequestBody @Validated LoginRequest loginRequest) {
        if (StringUtils.isAnyBlank(loginRequest.getUsername(), loginRequest.getPassword())) {
            return R.error(Status.REGISTER_ERROR.getCode(),
                    Status.REGISTER_ERROR.getMessage(), null, "用户名或密码不能为空");
        }
        TokenResponse tokenResponse = memberService.doLogin(loginRequest);

        return R.success(tokenResponse);
    }

4.封装全局异常处理类

import com.wwk.zhenxuan.common.R;
import com.wwk.zhenxuan.common.Status;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindException;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.List;

/**
 * 全局异常类
 * @author wwk
 */
@RestControllerAdvice
@Slf4j
public class GlobalException {
    /**
     * 捕获管理用户抛出的异常
     *
     * @param e 错误信息
     * @return 响应类
     */
    @ExceptionHandler(IntegerRangeException.class)
    public R integerRangeException(IntegerRangeException e) {
        log.warn("{},状态码:{}---错误描述:{}", e.getMessage(), e.getCode(), e.getDetails());
        return R.error(e.getCode(), e.getMessage(), null, e.getDetails());
    }

    /**
     * 捕获用户验证抛出的异常
     */

    @ExceptionHandler(BindException.class)
    public R bindException(BindException bindException) {
        List<ObjectError> allErrors = bindException.getAllErrors();

        for (ObjectError allError : allErrors) {
            log.warn("参数校验错误信息,错误信息:{}", allError.getDefaultMessage());
        }
        return R.error(Status.PARAMS_VALIDATED_ERROR.getCode(), Status.PARAMS_VALIDATED_ERROR.getMessage(),
                null, allErrors.get(0).getDefaultMessage());
    }
}

5.需要用到的工具类及枚举类(根据要求自行修改)

1.R工具类


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class R<T> implements Serializable {
    private Integer code;
    private String msg;
    private Object data;

    public static R success(Object data){
        return new R(1,"OK", data);
    }

    public static R success(Status status,Object data){
        return new R(status.getCode(), status.getMessage(), data);
    }


    public static R success(){
        return new R(1,"OK",null);
    }


    //失败各有不同
    public static R error(Status status) {
        return new R(status.getCode(), status.getMessage(), null);
    }

    public static R error(String msg) {
        return new R(0,msg,null);
    }

    public static R error(Status status, Object obj) {
        return new R(status.getCode(), status.getMessage(), obj);
    }


    public static R error(Integer code, String msg, Object obj) {
        return  new R(code,msg,obj);
    }
}

2.对应的状态码枚举类Status


public enum Status {
    LOGIN_SUCCESS(1,"登录成功"),
    SUCCESS(1,"成功"),
    ERROR(0,"失败"),

    NOT_FIND_PATH(0,"没有找到路径"),

    STATUS_ERROR(0,"请先把状态改为停售再操作"),

    NOT_EXIST(0,"用户不存在"),

    PASS_ERROR(0,"密码错误"),
    ADMIN_DISABLE(0,"用户已禁用"),
    NOT_FIND_DATA(0,"没有找到该用户对应的数据")
    ;

    private Integer code;
    private String message;

    Status(Integer code, String message) {
        this.code = code;
        this.message = message;
    }

    public Integer getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值