SpringBoot 注解@Valid的使用实例

在SpringBoot接口项目中使用@Valid注解进行请求参数验证

前言

在我们的接口项目开发中,一涉及到请求参数就免不了要进行参数校验,如果只有一到两个请求参数的话,我们可以直接在controller中通过if else进行校验,那么当参数较多的时候还用if else来校验的话
那代码写出来好像不是很好看的样子,那么为了解决这个问题,让我们的代码更简洁、高效,这里使用@Valid来进行请求参数的校验。

正文

1、引入Maven依赖

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

2、修改请求参数实体类

在请求参数实体上通过相关注解指定需要校验参数及返回对应的验证信息,直接先看代码

package com.test.demo.entity;

import lombok.Data;

import javax.validation.constraints.NotBlank;

/**
 * @Description:  测试实体
 * @Author:       Olrookie
 * @Date:         2023/5/23
 */
@Data
public class TestEntity {
    
    

    /**
     * 参数值
     */
    private String strKey;

    /**
     * 参数值
     */
    private String strValue;

    /**
     * appCode身份验证校验
     */
    @NotBlank(message = "参数appCode为必填参数!")
    private String appCode;

    /**
     * 页编号
     */
    @NotBlank(message = "参数pageNum,pageSize为必填参数!")
    private String pageNum;

    /**
     * 页大小
     */
    @NotBlank(message = "参数pageNum,pageSize为必填参数!")
    private String pageSize;

}

这里我们使用@NotBlank来对appCode、pageNum、pageSize三个参数进行校验并注明校验不通过时返回的信息message,这里@NotBlank是指定请求参数不能为null且不能为空,除了@NotBlank之外还有一些其它注解,如下表:

注解 描述
@Null 限制只能为null
@NotNull 限制必须不为null
@AssertFalse 限制必须为false
@AssertTrue 限制必须为true
@DecimalMax(value) 限制必须为一个不大于指定值的数字
@DecimalMin(value) 限制必须为一个不小于指定值的数字
@Digits(integer,fraction) 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
@Future 限制必须是一个将来的日期
@Max(value) 限制必须为一个不大于指定值的数字
@Min(value) 限制必须为一个不小于指定值的数字
@Past 限制必须是一个过去的日期
@Pattern(value) 限制必须符合指定的正则表达式
@Size(max,min) 限制字符长度必须在min到max之间
@Past 验证注解的元素值(日期类型)比当前时间早
@NotEmpty 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
@NotBlank 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
@Email 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式

3、使用注解@Valid,并返回验证失败信息

Controller代码详解

在接口实体类前加上注解@Valid即可进行请求参数验证,那么如果我们想返回验证失败的信息呢?
那我们需要在方法中加上参数BindingResult,用其承接验证失败的信息并返回

下方Controller代码详解:
1、首先我们通过公共方法paramCheck对BindingResult进行判断,判断其是否包含验证失败信息,如果未包含验证失败信息,则进一步验证请求参数appCode是否正确,并返回相关信息(这里跟我们今天讲的内容关系不大,不再进一步说明)
2、如果BindingResult包含验证失败信息则将其返回
3、这里返回内容使用的是统一的CommonResult类

package com.test.demo.controller;

import com.test.cloudapicommons.common.CommonResult;
import com.test.cloudapicommons.entities.BaseInfo;
import com.test.cloudapicommons.entities.ResponseCode;
import com.test.cloudapicommons.utils.JudgeUtils;
import com.test.demo.entity.TestEntity;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;

/**
 * @Description:  Demo1测试Controller
 * @Author:       Olrookie
 * @Date:         2023/5/22
 */
@Slf4j
@RestController
@RequestMapping("/api")
public class Demo1Controller {
    
    

    @GetMapping("/testDemo1")
    public CommonResult test(@Valid TestEntity testEntity, BindingResult bindingResult) {
    
    

        String paramCheckMsg = JudgeUtils.paramCheck(bindingResult);
        // 请求参数校验
        if ("success".equals(paramCheckMsg)) {
    
    
            // appCode校验
            if (JudgeUtils.identityCheck(testEntity.getAppCode())) {
    
    
                return new CommonResult(ResponseCode.RESULT_CODE_SUCCESS, BaseInfo.SUCCESS_INFO);
            }
            log.warn("appCode校验失败! 请求的错误appCode为:{}", testEntity.getAppCode());
            return new CommonResult(ResponseCode.RESULT_CODE_FALIER_IDENTITY, "appCode错误!");
        }
        return new CommonResult(ResponseCode.RESULT_CODE_PARAM_ERROR, paramCheckMsg);

    }
}

paramCheck判断方法详解

paramCheck方法先判断BindingResult是否包含验证失败信息,如果包含我这里让其默认返回第一条错误信息,成功则返回"success"

package com.test.cloudapicommons.utils;
import com.test.cloudapicommons.entities.BaseInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;

/**
 * @Description:  提取用于判断的公共方法
 * @Author:       Olrookie
 * @Date:         2023/5/23
 */
@Slf4j
public class JudgeUtils {
    
    

    /**
     *                 判断请求参数appCode是否正确
     * @param appCode  身份验证appCode
     * @return         true/false
     */
    public static Boolean identityCheck(String appCode) {
    
    
        return BaseInfo.APP_CODE.equals(appCode);
    }

    /**
     *                       返回实体类校验信息
     * @param bindingResult  BindingResult
     * @return               errorMsg/success
     */
    public static String paramCheck(BindingResult bindingResult) {
    
    
        // 通过BinidingResult绑定实体类校验信息
        if (bindingResult.hasErrors()) {
    
    
            // 如果实体类校验出现错误,则返回第一条错误信息的默认msg
            String errorMsg = bindingResult.getAllErrors().get(0).getDefaultMessage();
            log.warn("请求参数未通过校验:{}", errorMsg);
            return errorMsg;
        }
        return "success";
    }
}

统一返回信息

这里封装整个项目统一格式的返回内容,其包含响应码,响应日志以及具体返回内容

package com.test.cloudapicommons.common;

import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @Description:  统一给前端参数
 * @Author:       Olrookie
 * @Date:         2023/5/23
 */
@Data
@NoArgsConstructor
public class CommonResult <T> {
    
    

    /** 响应码 */
    private String code;
    /** 响应日志 */
    private String message;
    /** 实体类 */
    private T data;

    /**
     *
     * @param code     响应码
     * @param message  具体响应日志
     */
    public CommonResult(String code, String message) {
    
    
        this.code = code;
        this.message = message;
    }

    /**
     *
     * @param code     响应码
     * @param message  具体响应日志
     * @param data     具体返回的实体类
     */
    public CommonResult(String code, String message, T data) {
    
    
        this.code = code;
        this.message = message;
        this.data = data;
    }
}

4、接口测试

以下是通过ApiPost发送不同参数请求所返回的接口

4.1返回请求参数的验证失败信息

扫描二维码关注公众号,回复: 16795518 查看本文章

在这里插入图片描述
在这里插入图片描述

4.2请求成功返回的信息

在这里插入图片描述

结语

最近也是刚封装了一个SpringBoot的接口父项目,结合之前接口开发的问题就想到了注解@Valid,于是在这里写下这篇文章以作记录,也希望对大家有所帮助,如果有什么问题还希望大家不吝赐教,多多交流。最后,祝大家变得更强!

猜你喜欢

转载自blog.csdn.net/weixin_55549435/article/details/131109720
今日推荐