SpringBoot参数校验--List类型

2023-11-12

    我们在写后台接口的时候,通常会定义DTO来接收参数,在DTO中使用注解书写验证的规则;然后在Controller层使用@validated注解来验证自己制定的校验规则。但当我们的接口接收的参数为List<E>时,可以使用本文的方法进行校验。注:工具类部分代码在最后

包含验证规则的实体类:

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
@Data
public class SingleDTO {
    @ApiModelProperty(value = "主键ID", required = true)
    @NotBlank(message = "缺少参数:主键ID")
    @Pattern(regexp = "[0-9a-z]{8}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{12}",message = "主键ID格式有误:UUID格式")
    private String pkId;
}

 

参数校验:

import com.wingconn.aeocustoms.domain.dto.SingleDTO;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.validation.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

public class ValidatorUtilsTest {
    private static final Logger LOGGER = LoggerFactory.getLogger(ValidatorUtilsTest.class);

    private static Validator createValidator() {
        Configuration<?> config = Validation.byDefaultProvider().configure();
        ValidatorFactory factory = config.buildValidatorFactory();
        Validator validator = factory.getValidator();
        factory.close();
        return validator;
    }

    /**
     * Controller层验证List类型的参数
     */
    @Test
    public void validate() {
        List<SingleDTO> dtos = new ArrayList<>();
        SingleDTO singleDTO =  new SingleDTO();
        singleDTO.setPkId("12345678990");
        dtos.add(singleDTO);
        Validator validator = createValidator();
        for(SingleDTO dto : dtos) {
            Set<ConstraintViolation<SingleDTO>> violations  = validator.validate(dto);
            if (violations.size() == 0) {
                LOGGER.debug("No violations.");
                System.out.println("success");
            }else {
                LOGGER.error("%s violations:%n", violations.size());
                for(ConstraintViolation<SingleDTO> violation :violations){
                    LOGGER.error("参数:"+violation.getPropertyPath() + "  " + violation.getMessage());
                }
            }
        }
    }

}

用参数“1234567890”进行单元测试,结果为:

 

用参数“c076de6c-aeb3-4882-ba6c-a886942c53c4”进行单元测试,结果为:

单元测试表明该工具类可以使用。实际使用时,直接在Controller层使用该工具类,即可进行参数的校验。

工具类部分代码(缺少了返回值的实体类): 

package com.XXX.aasmgt.util;

import com.XXX.to.resultTo.ResultTO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.validation.*;
import java.util.List;
import java.util.Set;

/**
 * @author fusc
 * @date 2018/10/9 17:23
 */
public class ValidatorUtils {

    private static final Logger LOGGER = LoggerFactory.getLogger(ValidatorUtils.class);

    private static Validator createValidator() {
        Configuration<?> config = Validation.byDefaultProvider().configure();
        ValidatorFactory factory = config.buildValidatorFactory();
        Validator validator = factory.getValidator();
        factory.close();
        return validator;
    }

    /**
     * Controller层验证List类型的参数
     *
     * @return
     */
    public static <T> ResultTO validate(List<T> list) {
        Validator validator = createValidator();
        for (T dto : list) {
            Set<ConstraintViolation<T>> violations = validator.validate(dto);
            if (violations.size() == 0) {
                LOGGER.debug("No violations.");
                return ResultTO.operateSuccess();
            } else {
                LOGGER.error("%s violations:%n", violations.size());
                for (ConstraintViolation<T> violation : violations) {
                    LOGGER.error("参数:" + violation.getPropertyPath() + "  " + violation.getMessage());
                    return ResultTO.errorByInvalidParams(violation.getMessage());
                }
            }
        }
        return ResultTO.errorByInvalidParams("参数有误:参数列表为空!");
    }
}

************************************************************************************************************************************************* 

 另外一种方式( 摘抄自公众号“Java技术栈”)

为了能够进行嵌套验证,必须手动在Item实体的props字段上明确指出这个字段里面的实体也要进行验证。由于@Validated不能用在成员属性(字段)上,但是@Valid能加在成员属性(字段)上,而且@Valid类注解上也说明了它支持嵌套验证功能,那么我们能够推断出:@Valid加在方法参数时并不能够自动进行嵌套验证,而是用在需要嵌套验证类的相应字段上,来配合方法参数上@Validated或@Valid来进行嵌套验证。

我们修改Item类如下所示:

public class Item {

    @NotNull(message = "id不能为空")
    @Min(value = 1, message = "id必须为正整数")
    private Long id;

    @Valid // 嵌套验证必须用@Valid
    @NotNull(message = "props不能为空")
    @Size(min = 1, message = "props至少要有一个自定义属性")
    private List<Prop> props;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot参数校验--List类型 的相关文章

随机推荐

  • 开发文档怎么编写_需求开发之软需编写技巧

    一 什么是软需 软需全称软件需求规格说明书 是产品 项目在研发过程中必不可少的一份过程文档 主要由产品 项目的需求人员负责编写 编写软需之前一般要先进行用户需求分析 二 软需的作用 软需的编写时间一般是安排在需求确定之后 代码编写之前 因为
  • python处理字节流形式的视频

    python处理内存中字节流形式的视频 在使用python的streamlit库处理上传的文件时碰到一个问题 文件上传后是以字节数组的形式存在内存中 我在后续需要使用cv2库逐帧操作上传的视频 这里就产生一个问题 cv2怎么读取到内存中字节
  • Android 12 应用兼容性适配指导

    一 兼容性调试工具 Android 11开始引入了新的工具 可针对Android新平台中的行为变更进行测试和调试 这些工具是兼容性框架的一部分 该框架使得开发者可通过开发者选项或adb命令单独打开和关闭各项变更 藉此 可在最新android
  • 腾讯gpu-manager

    基本原理 vCUDA通过劫持CUDA的显存申请和释放请求 为每个容器管理它的显存使用量 进而实现了显存隔离 唯一需要注意的是申请context并不通过malloc函数 因此无法知道进程在context使用了多少显存 因此vcuda每次都去向
  • cocos creator创建简单的动态网格

    如果初次尝试cocos的动态网格创建 一定会遇到非常多的问题 所以刚开始使用 最好用一个简单的东西来实现 逐步的复杂化 下面代码展示了一个最基础的三角面的创建 代码 private initDyMesh const pos new Floa
  • 记导入第三方库Alamofire的坑

    按照网上打的操作步骤导入之后 存在No Such Module Alamofire 解决办法是重新Build 但是根本没用 原因是版本问题 选择一个合适的版本即可 在readme 文件可看到对应的版本情况
  • 人体姿态估计--RMPE: Regional Multi-Person Pose Estimation

    RMPE Regional Multi Person Pose Estimation ICCV2017 Code is based Caffe and Torch https github com MVIG SJTU RMPE https
  • Spring Boot如何实现缓存的自动刷新

    Spring Boot如何实现缓存的自动刷新 在Web应用程序中 缓存是提高性能的重要手段之一 在Spring Boot应用程序中 我们可以使用Spring Cache来实现缓存功能 然而 当缓存的数据发生变化时 我们可能需要手动刷新缓存
  • html5 imports,html - HTML5 Imports not working - Stack Overflow

    The correct to do this is through server side pages includes or through JavaScript PHP example Welcome to my home page S
  • 在浏览器输入localhost:3000显示需要新应用打开此localhost原因

    今天做web应用开发时遇到在使用非谷歌浏览器时 输入localhost 3000 显示如下 显示需要新应用打开此localhost 实在是没办法显示出网页 经过反复尝试终于发现问题其实是现在使用非Chrome浏览器 在地址栏输入不带http
  • E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。

    ubuntu apt 安装软件的时候 经常有这种错误 是由于依赖关系无法满足而引起的 比如我在安装pangolin的时候 提示 下列软件包有未满足的依赖关系 libxkbcommon dev 依赖 libxkbcommon0 0 8 0 1
  • vm安装Ubuntu 本机navicat连接Ubuntu MySQL

    先下载 虚拟机软件 VMware Workstation Pro 我下的16版 自己找密钥 打开VMware Workstation Pro 左侧右键鼠标 新建虚拟机 如图 选择典型 下一步 稍后安装系统 下一步 选择系统 我选 Linux
  • MVC知识整理

    MVC基础知识整理 ASP NETMVC框架 这里以MVC5为例 涉及到知识有 Model View Controller的使用 Area和Global的理解 路由配置 数据传递的方式 AOP思想的体现 4大过滤器 各种Result Raz
  • 台式计算机关闭屏幕快捷键,多种电脑屏幕关闭方法推荐

    有时因为需要节约电脑电量 有时因为为避免同事窥屏 有时由于顾及后台运行任务进程诸如听歌 电脑磁盘碎片整理等多种原因 这些均促使我们需要关闭电脑屏幕 无论基于何种原因促使我们关闭电脑屏幕 总的来说其并不容易操作 与台式机设置专门显示屏关机按键
  • H.264中的熵编码算法(主讲指数哥伦布编码)

    以下文章参考于殷文杰的博客 https yinwenjie blog csdn net article details 52301584 1 熵编码基本概念 1 熵 这一概念原本来自于化学和热力学 用于度量能量退化的指标 即熵越高 物体或系
  • HTTP 499 状态码 nginx下 499错误的解决办法

    HTTP 499 状态码 nginx下 499错误的解决办法 日志记录中HTTP状态码出现499错误有多种情况 比如nginx反代到一个永远打不开的后端 日志状态记录就会是499 发送字节数是0 经常有用户反馈网站系统时好时坏 因为线上的产
  • 【转】Robust regression(稳健回归)

    Robust regression 稳健回归 语法 b robustfit X y b robustfit X y wfun tune b robustfit X y wfun tune const b stats robustfit 描述
  • 在服务器上用conda创建新的python环境报错(PackagesNotFoundError)

    主要参考这篇博客 https blog csdn net weixin 43815222 article details 108549497 报错截图 prefix 后跟的是我的虚拟环境路径 home envs assignmaterial
  • 汉诺塔——递归的应用

    关于汉诺塔的原理 可看这里 点击打开链接 下面是源代码 include
  • SpringBoot参数校验--List类型

    我们在写后台接口的时候 通常会定义DTO来接收参数 在DTO中使用注解书写验证的规则 然后在Controller层使用 validated注解来验证自己制定的校验规则 但当我们的接口接收的参数为List