通过spring-boot validation依赖,完成对实体类的参数校验

作用

这个依赖项是用于在Spring Boot应用程序中启用验证(Validation)功能的Starter依赖项。

作用如下:

  1. 启用验证功能:该依赖项为您提供了Spring Boot中的验证功能。它包含了验证所需的类和配置,以便在应用程序中执行验证操作。

  2. 支持JSR 303验证规范:该依赖项基于Java标准化的JSR 303验证规范,提供了对Bean验证(Bean Validation)功能的支持。您可以使用注解(例如@NotNull@Size@Pattern等)对Java Bean的属性进行验证,以确保数据的有效性。

  3. 集成验证器:该依赖项还集成了常用的验证器(Validator),例如Hibernate Validator,用于执行验证操作并检测验证失败的情况。

通过添加这个依赖项,您可以在Spring Boot应用程序中轻松使用验证功能,并且可以在请求参数校验、表单验证等场景下使用注解进行数据验证。

使用方式

1.通过maven引入导入依赖


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

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

package com.wwk.usercenter.model.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
import org.hibernate.validator.constraints.Length;

import javax.validation.constraints.NotBlank;

/**
 *
 * @TableName user
 */
@TableName(value ="user")
@Data
public class User implements Serializable {
    
    
    /**
     * id
     */
    @TableId(type = IdType.AUTO)
    private Long id;

    /**
     * 昵称
     */
    private String nickname;

    /**
     * 用户名
     */
    @NotBlank(message = "用户名不能为空")
    @Length(min = 4,message = "用户名至少4位")
    private String username;

    /**
     * 密码
     */
    @NotBlank(message = "密码不能为空")
    @Length(min = 8,message = "密码至少8位")
    private String userPassword;


    /**
     * 确认密码(非数据库字段)
     */
    @TableField(exist = false)
    @NotBlank(message = "确认密码不能为空")
    @Length(min = 8,message = "确认密码至少8位")
    private String checkPassword;

    /**
     * 头像
     */
    private String avatarUrl;

    /**
     * 性别 0未知 1男 2女
     */
    private Integer gender;

    /**
     * 电话
     */
    private String phone;

    /**
     * 邮箱
     */
    @Email(message = "邮箱格式不正确")
    private String email;

    /**
     * 状态 0:正常 1:异常
     */
    private Integer userStatus;

    /**
     * 创建时间
     */
    private Date createTime;

    /**
     * 更新时间
     */
    private Date updateTime;

    /**
     * 是否删除
     */
    private Integer isDelete;

所有验证的注解 及解释

序号 注解 解释
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接收到的参数进行验证

import com.wwk.usercenter.model.entity.User;
import com.wwk.usercenter.utils.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import java.util.stream.Collectors;

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
    
    

    @RequestMapping("/register")
    public R register(@RequestBody @Validated User user, BindingResult bindingResult) {
    
    
        Map<String, Object> map = new HashMap<>();

        // 检查绑定结果中是否存在字段错误
        if (bindingResult.getFieldErrors().size() > 0) {
    
    
            // 遍历每个字段错误,并将字段名和错误消息存储在map中
            bindingResult.getFieldErrors().forEach(fieldError -> {
    
    
                String field = fieldError.getField();
                String message = fieldError.getDefaultMessage();
                map.put(field, message);
            });

            // 记录错误消息
            map.forEach((field, message) -> {
    
    
                log.error("错误信息---->{}:{}", field, message);
            });

            // 收集错误消息并返回带有错误状态和消息的响应
            List<Object> errMessages = map.keySet().stream().map(key -> map.get(key)).collect(Collectors.toList());
            return R.error(444, "用户信息校验异常", errMessages);
        }

        // 没有字段错误,继续注册流程...
        System.out.println(user);
        return R.success("用户注册成功");
    }
};

4.需要用到的工具类及枚举类

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;
    }
}

猜你喜欢

转载自blog.csdn.net/m0_59757074/article/details/130876691