spring中使用@Validated,什么是JSR 303数据校验,spring boot中怎么使用数据校验
文章目录
- 一、JSR 303后台数据校验
- 1.1 什么是 JSR303?
- 1.2 为什么使用 JSR 303?
- 二、Spring Boot 中使用数据校验
- 2.1 基本注解校验
- 2.1.1 使用步骤
- 2.1.2 举例
- @Valid注解
- 全局统一异常处理
- 2.2 分组校验
- 2.2.1 使用步骤
- 2.2.2 举例
- @Validated注解
- @Validated和@Valid的区别
- 2.3 自定义校验注解
- 2.3.1 使用步骤
- 2.3.2 举例
- 2.4 相关注解
- 2.4.1 空检查相关注解
- 2.4.2 长度检查
- 2.4.3 布尔值检查
- 2.4.4 日期检查
- 2.4.5 数值检查
- 2.4.6 其他
一、JSR 303后台数据校验
1.1 什么是 JSR303?
JSR 是 Java Specification Requests 的缩写,即 Java 规范提案。存在各种各样的 JSR,简单的理解为 JSR 是一种 Java 标准。JSR 303 是其中数据检验的一个标准(Bean Validation 1.0 (JSR 303))。
1.2 为什么使用 JSR 303?
-
处理一段业务逻辑,首先要确保数据输入的正确性,所以需要先对数据进行检查,保证数据在语义上的正确性,再根据数据进行下一步的处理。
-
前端可以通过 js 程序校验数据是否合法,后端同样也需要进行校验。而后端最简单的实现就是直接在业务方法中对数据进行处理,但是不同的业务方法可能会出现同样的校验操作,这样就出现了数据的冗余。
-
为了解决这个情况,JSR 303 出现了。JSR 303 使用 Bean Validation,即在 Bean 上添加相应的注解,去实现数据校验。这样在执行业务方法前,都会根据注解对数据进行校验,从而减少自定义的校验逻辑,减少代码冗余。
二、Spring Boot 中使用数据校验
2.1 基本注解校验
之前在 Spring MVC 中介绍了数据校验,也例举了常用的注解。但是使注解生效必须要在 springmvc.xml 中配置,假如没有配置文件(比如在 spring boot)中怎么办?----> 下面详细介绍
spring boot 中需要引入依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2.1.1 使用步骤
1、在相关的 Bean 上标注需要处理的注解,并指定需要提示的信息(若不指定,会从默认配置文件中读取默认的信息)。
2、在相关的方法上,使用 @Valid 注解(或者 @Validated 指定组名)标记需要被校验的数据,否则会不生效。
注意:检测到数据异常后,系统会向外抛出异常,如果做了统一异常处理,可以根据 postman 测试的结果,找到控制台打印出的相应的异常,并处理。
3、处理异常。
-
使用 BindingResult 处理;
-
也可以使用 全局统一异常 处理(@RestControllerAdvice 与 @ExceptionHandler)
全局统一异常处理后续会讲
2.1.2 举例
1、在相关的 Bean 上标注注解,并写上指定信息。
@Data
public class Emp {@NotNull(message = "id 不能为 null")private Integer id;@NotNull(message = "name 不能为 null")private String name;
}
@Valid注解
2、Controller层中使用 @Valid 注解标记需要检测的数据。
@RestController
public class EmpController {@PostMapping("/emp")public String createEmp(@Valid @RequestBody Emp emp) {return "ok";}
}
3、测试时,假如不传 id、name,会抛出 MethodArgumentNotValidException 异常。使用 BindingResult 可以处理异常信息,但 通常使用统一异常处理。
① 使用 BindingResult:
@RestController
public class EmpController {@PostMapping("/emp")public Map createEmp(@Valid @RequestBody Emp emp, BindingResult result) {if (result.hasErrors()) {Map<String, String> map = new HashMap<>();// 获取校验结果,遍历获取捕获到的每个校验结果result.getFieldErrors().forEach(item -> {// 获取校验的信息String message = item.getDefaultMessage(); // 也获取message的值String field = item.getField(); //获取属性名// 存储得到的校验结果map.put(field, message);});return map;}return "ok";}
}
问题:通过上面的步骤,已经可以捕获异常、处理异常,但是每次都是在业务方法中手动处理逻辑,这样的实现,代码肯定会冗余。可以将其抽出,使用 统一异常处理,每次异常发生时,将其捕获。
全局统一异常处理
② 全局统一异常处理:@RestControllerAdvice、@ExceptionHandler
@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(MethodArgumentNotValidException.class)public Map handlerValidException(MethodArgumentNotValidException e) {BindingResult result = e.getBindingResult();Map<String, String> map = new HashMap<>();// 获取校验结果,遍历获取捕获到的每个校验结果result.getFieldErrors().forEach(item ->{// 存储得到的校验结果map.put(item.getField(), item.getDefaultMessage());});return map;}
}
Controller 中不需要再用 BindingResult 去处理数据了。
2.2 分组校验
1、为什么使用 分组校验?
上面的过程,如果出现多个方法,都需要校验 Bean,且校验规则不同的时候,怎么办呢?分组校验就可以去解决该问题,每个分组指定不同的校验规则,不同的方法执行不同的分组,就可以得到不同的校验结果。
2、JSR 303 的每个注解都默认具备三个属性:
- message 用来定义数据校验失败后的提示消息,默认读取配置文件的内容。idea 全局搜索
ValidationMessages.properties
,可以看到默认的信息。 - groups 用来定义分组,它是一个 class 数组,可以指定多个分组。
- payload()
String message() default "{javax.validation.constraints.NotNull.message}";Class<?>[] groups() default { };Class<? extends Payload>[] payload() default { };
2.2.1 使用步骤
1、定义一个空接口,用于指定分组,内部不需要任何实现。
2、指定 注解时,通过 groups 指定分组。用于指定在某个分组条件下,才去执行校验规则。
3、在 Controller 中通过 @Validated 注解指定分组,去指定校验。
注:使用分组校验后,Bean 注解上若不指定分组,则不会执行校验规则。
2.2.2 举例
1、如:创建两个分组接口 AddGroup、UpdateGroup。
AddGroup 用于指定 添加数据 时的校验规则(比如:id、name 均不为 null)。
UpdateGroup 用于指定 修改数据 时的校验规则(比如:name 不允许为 null)。
2、给 Bean 添加注解,并指定分组信息。
@Data
public class Emp {@NotNull(message = "id 不能为 null", groups = {AddGroup.class})private Integer id;@NotNull(message = "name 不能为 null", groups = {AddGroup.class, UpdateGroup.class})private String name;
}
@Validated注解
3、通过 @Validated 注解指定分组,去指定校验
@RestController
public class EmpController {@PostMapping("/emp")public void createEmp(@Validated({AddGroup.class}) @RequestBody Emp emp) {}@PutMapping("/emp")public void UpdateEmp(@Validated({UpdateGroup.class}) @RequestBody Emp emp) {}
}
@Validated和@Valid的区别
-
@Validated:
- Spring 框架特有的注解,是标准 JSR-303 的一个变种,提供了一个分组功能。
- 作用在类上、方法上、方法参数上,不能作用于成员属性上。
-
@Valid:
-
标准 JSR-303 规范的标记型注解。
-
作用在方法、构造函数、方法参数、成员属性上。
-
2.3 自定义校验注解
上面的注解满足不了业务需求时,可以自定义校验注解、然后自定义校验规则。
2.3.1 使用步骤
1、自定义一个校验注解。可以创建一个 ValidationMessages.properties 用于保存默认的 message 信息。
2、自定义一个校验器(即自定义校验规则):实现 ConstraintValidator 接口,并重写相关方法。
-
initialize :初始化,可以获取 自定义的属性的值。
-
isValid :校验,可以获取到实际的值,然后与自定义的属性值进行比较。
3、将校验注解 与 校验器 关联起来。@Constraint(validatedBy = {校验器类.class})
2.3.2 举例
自定义一个校验规则,判断数据长度是否合法。
1、自定义一个校验注解:(比如这里是@TestValid)
@Target({FIELD})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy={JiaoYan.class})
public @interface TestValid {// 提示信息String message() default "{本自定义注解的全类名.message}";class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};/*** 返回一个长度* @return 默认为 5*/int length() default 5;
}
配置文件内容为:
自定义注解的全类名.message=值不能为 Null,且长度不超过 5
2、自定义一个校验器(比如这里是 JiaoYan)
/*** 实现 ConstraintValidator 接口,* 其中 ConstraintValidator 的泛型,一个需要指定自定义的注解,一个需要指定需要获取的值的类型。* 比如:* ConstraintValidator<TestValid, String> 中* TestValid 表示自定义注解* String 表示获取的值的类型* 即定义规则,判断一个 String 的值的长度是否满足条件*/
public class JiaoYan implements ConstraintValidator<TestValid, String> {/*** 用于保存自定义的(默认)长度*/private int length;/*** 初始化方法,获取默认数据* @param test 注解对象*/@Overridepublic void initialize(TestValid test) {length = test.length();}/*** 自定义校验规则,如果 String 为 Null 或者 长度大于 5,则校验失败(返回 false)* @param value 需要校验的值* @param context* @return true 表示校验成功,false 表示校验失败*/@Overridepublic boolean isValid(String value, ConstraintValidatorContext context) {return value == null ? false : length > value.length();}
}
3、使用注解
@Data
public class Emp {@NotNull(message = "id 不能为 null", groups = {AddGroup.class})private Integer id;// 默认@TestValid()@NotNull(message = "name 不能为 null", groups = {AddGroup.class, UpdateGroup.class})private String name;// 自定义@TestValid(length = 10, message = "值不能为 Null 且长度不超过 10", groups = {AddGroup.class})private String email;
}
2.4 相关注解
2.4.1 空检查相关注解
注解 | 注解详情 |
---|---|
@Null | 被指定的注解元素必须为 Null |
@NotNull | 任意类型,不能为 Null,但可以为空,比如:空数组[]、空字符串"" |
@NotBlank | 针对字符串,不能为 Null,且去除前后空格后的字符串长度要大于 0 |
@NotEmpty | 针对字符串、集合、数组,针对字符串时,不能为 Null,且长度要大于 0 |
2.4.2 长度检查
注解 | 注解详情 |
---|---|
@Size | 针对字符串、集合、数组,判断长度是否在给定范围内 |
@Length | 针对字符串,判断长度是否在给定范围内 |
2.4.3 布尔值检查
注解 | 注解详情 |
---|---|
@AssertTrue | 针对布尔值,用来判断布尔值是否为 true |
@AssertFalse | 针对布尔值,用来判断布尔值是否为 false |
2.4.4 日期检查
注解 | 注解详情 |
---|---|
@Past | 针对日期,用来判断当前日期是否为 过去的日期 |
@Future | 针对日期,用来判断当前日期是否为 未来的日期 |
2.4.5 数值检查
注解 | 注解详情 |
---|---|
@Max(value) | 针对字符串、数值,用来判断是否小于等于某个指定值 |
@Min(value) | 针对字符串、数值,用来判断是否大于等于某个指定值 |
2.4.6 其他
注解 | 注解详情 |
---|---|
@Pattern | 验证字符串是否满足正则表达式 |
@Email | 验证字符串是否满足邮件格式 |
@Url | 验证是否满足 url 格式 |
@Digits | 验证数字整数和小数位数,如:@Digits(integer=6, fraction=2) |
文章结束!恭喜你又学会了一个知识点!!!
相关文章:
spring中使用@Validated,什么是JSR 303数据校验,spring boot中怎么使用数据校验
文章目录 一、JSR 303后台数据校验1.1 什么是 JSR303?1.2 为什么使用 JSR 303? 二、Spring Boot 中使用数据校验2.1 基本注解校验2.1.1 使用步骤2.1.2 举例Valid注解全局统一异常处理 2.2 分组校验2.2.1 使用步骤2.2.2 举例Validated注解Validated和Vali…...
RabbitMQ中的异步Confirm模式:提升消息可靠性的利器
在现代分布式系统中,消息队列(Message Queue)扮演着至关重要的角色,它能够解耦系统组件、提高系统的可扩展性和可靠性。RabbitMQ作为一款广泛使用的消息队列中间件,提供了多种机制来确保消息的可靠传递。其中ÿ…...
C++ 设计模式:代理模式(Proxy Pattern)
链接:C 设计模式 链接:C 设计模式 - 门面模式 链接:C 设计模式 - 中介者 链接:C 设计模式 - 适配器 代理模式(Proxy Pattern)是一种结构型设计模式,它为其他对象提供一种代理以控制(…...
41.1 预聚合提速实战项目之需求分析和架构设计
本节重点介绍 : 需求分析架构设计 需求分析 使用预聚合提速查询并且降低高基数查询对后端的压力用户无需变更grafana上的查询语句,后端自动替换效果图 架构设计 架构图 解决方案说明 heavy_query对用户侧表现为查询速度慢在服务端会导致资源占用过多甚至打挂…...
学习路之VScode--自定义按键写注释(插件)
1. 安装 "KoroFileHeader" 插件 首先,在 VScode 中搜索并安装名为 "KoroFileHeader" 的插件。你可以通过在扩展商店中搜索插件名称来找到并安装它。 2. 进入 VScode 设置页面 点击 VScode 左下角的设置图标,然后选择 "设置&q…...
Web安全 - “Referrer Policy“ Security 头值不安全
文章目录 概述原因分析风险说明Referrer-Policy 头配置选项1. 不安全的策略no-referrer-when-downgradeunsafe-url 2. 安全的策略no-referreroriginorigin-when-cross-originsame-originstrict-originstrict-origin-when-cross-origin 推荐配置Nginx 配置示例 在 Nginx 中配置 …...
Milvus×EasyAi:如何用java从零搭建人脸识别应用
如何从零搭建一个人脸识别应用?不妨试试原生Java人工智能算法:EasyAi Milvus 的组合拳。 本文将使用到的软件和工具包括: EasyAi:人脸特征向量提取Milvus:向量数据库用于高效存储和检索数据。 01. EasyAi:…...
CGAL windows 安装教程
1.下载源代码 CGAL官网下载https://github.com/CGAL/cgal/releases 2.下载boost库 BOOST官网下载https://www.boost.org/ 3.下载 GMP and MPFR 4.配置VS2022 头文件: 库路径 做完以上步骤,可以使用CGAL了!...
低代码开源项目Joget的研究——Joget8社区版安装部署
大纲 环境准备安装必要软件配置Java配置JAVA_HOME配置Java软链安装三方库 获取源码配置MySql数据库创建用户创建数据库导入初始数据 配置数据库连接配置sessionFactory(非必须,如果后续保存再配置)编译下载tomcat启动下载aspectjweaver移动jw…...
【Ubuntu 20.4安装截图软件 flameshot 】
步骤一: 安装命令: sudo apt-get install flameshot 步骤二: 设置快捷方式: Ubuntu20.4 设置菜单,点击 号 步骤三: 输入软件名称, 软件快捷命令(flameshot gui)&am…...
AUTOSAR 平台介绍 (R24-11新标准发布!)
AUTOSAR 平台介绍——R24-11 0引言 随着技术的不断进步和市场需求的变化,AUTOSAR在汽车行业中的重要性日益增强。R24-11版本作为AUTOSAR平台的重要更新,旨在提升系统性能、安全性和用户体验。本文将详细介绍R24-11版本的主要更新内容 1 AUTOSAR介绍 AUTOSAR汽车软件架构,旨…...
Framework开发入门(一)之源码下载
一、使用Linux操作系统的小伙伴可以跳转到官网链接按提示操作 官网源码地址:下载源代码 | Android Open Source Project 1.创建一个空目录来存放您的工作文件。为其指定一个您喜欢的任意名称: mkdir WORKING_DIRECTORYcdWORKING_DIRECTORY …...
CentOS7下的 OpenSSH 服务器和客户端
目录 1. 在 IP 地址为 192.168.98.11 的 Linux 主机上安装 OpenSSH 服务器; 2. 激活 OpenSSH 服务,并设置开机启动; 3. 在 IP 地址为 192.168.98.22 的 Linux 主机上安装 OpenSSH 客户端,使用客户端命令(ssh、 scp、…...
rocketmq5--(三)--broker发送消息给消费者
202412/30回过头来记录一下:之前一直找不到在哪里把消息丢给消费者(2024/11/23),找了很久都没找到,就放弃了,然后发现,我靠原来是在poplongpollingservice里。。。。还是乱打断点,偶…...
QComboBox中使用树形控件进行选择
事情是这样的,要在一个ComboBox中通过树形结构进行内容的选择。 默认的QComboBox展开是下拉的列表。因此需要定制一下。 效果就是这样的 实现上面效果的核心代码就是下面这样的 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { treenew…...
单片机中运行多个定时器
在单片机的裸机编程环境中,同时运行多个定时器是完全可行的,但需要注意一些关键点以确保系统的稳定性和效率。以下是一些考虑因素和实现方法: 1. 硬件支持 定时器数量:首先确认您的单片机是否具备足够的定时器资源。大多数现代…...
go 模拟TCP粘包和拆包,及解决方法
1. 什么是 TCP 粘包与拆包? 粘包(Sticky Packet) 粘包是指在发送多个小的数据包时,接收端会将这些数据包合并成一个数据包接收。由于 TCP 是面向流的协议,它并不会在每次数据发送时附加边界信息。所以当多个数据包按顺…...
论文笔记PhotoReg: Photometrically Registering 3D Gaussian Splatting Models
1.abstract 最近推出的3D高斯飞溅(3DGS),它用多达数百万个原始椭球体来描述场景,可以实时渲染。3DGS迅速声名鹊起。然而,一个关键的悬而未决的问题仍然存在:我们如何将多个3DG融合到一个连贯的模型中?解决这个问题将使…...
宝塔服务器安装备份配置
1.服务器下载安装宝塔功能 if [ -f /usr/bin/curl ];then curl -sSO https://download.bt.cn/install/install_panel.sh;else wget -O install_panel.sh https://download.bt.cn/install/install_panel.sh;fi;bash install_panel.sh ed8484bec执行后选择y 等待下载完成会给出…...
ubuntu22 安装CUDA
在Ubuntu系统中,使用nvidia-smi命令可以看到当前GPU信息,在右上角可以看到CUDA Version,意思是最大支持的CUDA版本号。 安装下载 CUDA Toolkit 11.6 Downloads | NVIDIA Developer https://developer.nvidia.com/cuda-downloads?target_osL…...
LabVIEW故障诊断中的无故障数据怎么办
在使用LabVIEW进行故障诊断时,可能会面临“无故障数据”的情况。这种情况下,缺乏明确的故障参考,使得系统难以通过传统对比法进行故障识别。本文将介绍应对无故障数据的关键策略,包括数据模拟、特征提取和基于机器学习的方法&…...
开发模式选择与最佳实践指南20241230
开发模式选择与最佳实践指南 引言 在现代软件开发中,选择合适的开发模式直接影响项目的开发效率和质量。本文将帮助您: 🎯 了解三种主流开发模式的优缺点💡 根据项目特点选择最适合的开发模式🔧 掌握混合开发模式的…...
超详细!一文搞定PID!嵌入式STM32-PID位置环和速度环
本文目录 一、知识点1. PID是什么?2. 积分限幅--用于限制无限累加的积分项3. 输出值限幅--用于任何pid的输出4. PID工程 二、各类PID1. 位置式PID(用于位置环)(1)公式(2)代码使用代码 2. 增量式…...
Redhat7 PCS建立无共享存储浮动地址集群
更新记录 日期版本号内容9/22/2024Ver 1.0重新排版修正 0写在前面 0.1 简述 时间有限使用VMware6.7环境使用Centos7.8最小化安装方式(不用配置本地yum仓库)注意查看主机名(主机双机操作,部分单机操作) 序号HostIPAd…...
爱思唯尔word模板
爱思唯尔word模板 有时候并不一定非得latex https://download.csdn.net/download/qq_38998213/90199214 参考文献书签链接...
交换机Vlan中 tagged和untagged的区别
pvid,tagged与untagged pvid是交换机一个端口上的id,一个端口只能有一个pvid,多个端口可以有相同的pvid。 一:接收数据 Untagged:不管收到的数据帧是否已经有VLAN标记,将数据帧中的vlan标记修改为自己的pvi…...
软件需求分析期末知识点整理
前言:本文为wk学子量身打造,帮助大家少挂科。主要根据ls的会议进行整理。懂得都懂。 重点还是多看看课本 第2章 需求获取的方法 第3章 3.1.2 控制需求(案例*2) 第4章 4.3 范式 第5章 5.2.3 原子功能(案例) 5.2.4 划分功能(案例)5.3.3 工作流图(画图) 第…...
PyAudio使用手册
PyAudio 是一个功能强大的 Python 库,用于在 Python 中进行音频输入和输出操作 1. 安装 在使用 PyAudio 之前,需要先安装它。可以使用 pip 进行安装: pip install pyaudio在某些系统(如 Ubuntu)上,可能还需…...
总结TCP/IP四层模型
总结TCP/IP四层模型 阅读目录(Content) 一、TCP/IP参考模型概述 1.1、TCP/IP参考模型的层次结构二、TCP/IP四层功能概述 2.1、主机到网络层 2.2、网络互连层 2.3、传输层 2.3、应用层 三、TCP/IP报文格式 3.1、IP报文格式3.2、TCP数据段格式3.3、UDP数据段格式3.4、套…...
《深入挖掘Python加解密:自定义加密算法的设计与实现》
利用python实现加解密 在正式编写各种加解密前,我们先写个小案例,如下。 封面在文末呦! 基础加解密-源码 # 加密 def encode():source01 乐茵for c in source01:ascii01 ord(c)ascii01 1print(chr(ascii01), end)# 解密 def decode():…...
【前端,TypeScript】TypeScript速成(六):函数
函数 函数的定义 定义一个最简单的加法函数: function add(a: number, b: number): number {return a b }(可以看到 JavaScript/TypeScript 的语法与 Golang 也非常的相似) 调用该函数: console.log(add(2, 3)) // out [LOG…...
Python中元组(tuple)内置的数据类型
在Python中,元组(tuple)是一种内置的数据类型,用于存储不可变的有序元素集合。元组在很多方面与列表(list)相似,但它们之间存在一些关键的区别。以下是关于Python元组的详细解释: 定…...
AI安全的挑战:如何让人工智能变得更加可信
引言 随着人工智能(AI)技术在各个领域的广泛应用,尤其是在医疗、金融、自动驾驶和智能制造等行业,AI正在重塑我们的工作和生活方式。从提高生产效率到实现个性化服务,AI带来了前所未有的便利。然而,在享受这…...
redis用途都有哪些
Redis,作为一个开源的高性能键值对数据库,其用途广泛且功能强大。 1. 缓存(Caching): • Redis常被用作缓存层,存储那些频繁访问但不易改变的数据,如用户会话、商品详情等。 • 通过将这些数据存…...
【Django篇】--动手实现路由模块化与路由反转
一、路由模块化 在一个Django项目中,由于功能类别不同,因此需要将不同功能进行模块化设计。在Django项目中模块化设计则需要将不同模块封装为对应的app模块,每一个模块中涉及到的路由则也需要进行模块化设计,才能更好的让整个项目…...
自研国产零依赖前端UI框架实战008 用户表单以及随机ID
前言 通过前面的努力,我们的组件已经越来越多了,我们的功能也越来越完善. 不过我们的新增用户的功能还没有做. 接下来, 就让我们实现新增用户的功能. 显示新增用户的表单 首先, 我们先把新增用户的表单显示出来. 我们可以复用之前的组件. <zdp_button1 text"新增…...
【数据结构-单调队列】力扣LCR 184. 设计自助结算系统
请设计一个自助结账系统,该系统需要通过一个队列来模拟顾客通过购物车的结算过程,需要实现的功能有: get_max():获取结算商品中的最高价格,如果队列为空,则返回 -1 add(value):将价格为 value …...
项目管理和协作平台Maintainer、Guest、Reporter、Owner 和 Developer 是常见的用户角色
在项目管理和协作平台上,Maintainer、Guest、Reporter、Owner 和 Developer 是常见的用户角色,每个角色有不同的权限和责任。以下是这些角色的详细区别: 1. Guest(访客) 权限:最低级别的权限。访问&#…...
探索电商数据:爬取不同平台商品信息的Python实践
在数字化时代,电商平台的商品信息成为了宝贵的数据资源。除了亚马逊,全球还有许多电商平台的商品信息值得爬取。本文将介绍几个值得关注的电商平台,并提供Python代码示例,展示如何爬取这些平台的商品信息。 1. 京东 (JD.com) 京…...
Autoware Universe 安装记录
前提: ubuntu20.04,英伟达显卡。 演示:https://www.bilibili.com/video/BV1z4CbYFEwr/?spm_id_from333.337.search-card.all.click ROS2-Galactic安装 wget http://fishros.com/install -O fishros && . fishros 选择galactic(R…...
CAT3D: Create Anything in 3D with Multi-View Diffusion Models 论文解读
24年5月的论文,上一版就是ReconFusion 目录 一、概述 二、相关工作 1、2D先验 2、相机条件下的2D先验 3、多视角先验 4、视频先验 5、前馈方法 三、Method 1、多视角扩散模型 2、新视角生成 3、3D重建 一、概述 该论文提出一种CAT3D方法,实现…...
群落生态学研究进展▌Hmsc包对于群落生态学假说的解读、Hmsc包开展单物种和多物种分析的技术细节及Hmsc包的实际应用
HMSC(Hierarchical Species Distribution Models)是一种用于预测物种分布的统计模型。它在群落生态学中的应用广泛,可以帮助科学家研究物种在不同环境条件下的分布规律,以及预测物种在未来环境变化下的潜在分布范围。 举例来说&a…...
C 进阶 — 程序环境和预处理
C 进阶 — 程序环境和预处理 主要内容 程序的编译和执行环境 C 程序编译和链接 预定义符号 预处理指令 #define 预处理指令 #include 预处理指令 #undef 预处理操作符 # 和 ## 宏和函数对比 命令行定义 条件编译 一 程序的编译和执行环境 ANSI C 存在两个不同环境…...
基于单片机的温湿度采集系统(论文+源码)
2.1系统的功能 本系统的研制主要包括以下几项功能: (1)温度检测功能:对所处环境的温度进行检测; (2)湿度检测功能:对所处环境的湿度进行检测; (3)加热和制冷功能:可以完成加热和制冷功能。 (4)加湿和除…...
【数据分析处理之缺失值】
文章目录 一、缺失值的影响1. 统计分析的偏差2. 机器学习模型的性能下降3. 数据质量和可信度下降4. 数据利用率降低5. 增加数据预处理的复杂度 二、识别缺失值1. 使用工具识别缺失值2. 可视化缺失数据 三、处理缺失值的策略1. 删除含缺失值的行或列2. 填充缺失值a. 用常数填充b…...
【大模型实战篇】Mac本地部署RAGFlow的踩坑史
1. 题外话 最近一篇文章还是在11月30日写的,好长时间没有打卡了。最近工作上的事情特别多,主要聚焦在大模型的预训练、微调和RAG两个方面。主要用到的框架是Megatron-DeepSpeed,后续会带来一些分享。今天的文章主要聚焦在RAG。 近期调研了一系…...
SQL Server实现将分组的其他字段数据拼接成一条数据
在 SQL Server 中,可以使用 STRING_AGG 函数(SQL Server 2017 及更高版本支持)将分组的其他字段数据拼接成一条数据。以下是示例代码: 假设有一个表 Orders,结构如下: OrderIDCustomerIDProduct1C001Appl…...
STM32 高级 物联网通讯之蓝牙通讯
目录 蓝牙基础知识 蓝牙概述 蓝牙产生背景 蓝牙发展历程 蓝牙技术类型 经典蓝牙(BR/EDR和AMP) 低功耗蓝牙(BLE) 市场上常见蓝牙架构 SOC蓝牙单芯片方案 SOC蓝牙+MCU方案 蓝牙host+controller分开方案 蓝牙协议栈 蓝牙芯片架构 BLE低功耗蓝牙协议栈框架 物理…...
堆排序基础与实践:如何在Java中实现堆排序
目录 一、堆排序的基本原理 二、堆排序的实现步骤 三、堆排序的时间复杂度和空间复杂度 四、堆排序的工作流程 五、堆排序的优缺点 六、堆排序的应用场景 堆排序(Heap Sort)是一种基于堆数据结构的排序算法。堆是一种特殊的完全二叉树,…...
你有哪些Deep Learning(RNN、CNN)调参的经验?
在深度学习的实践中,调参是一项既艺术又科学的工作。它不仅需要理论知识的支撑,还需要大量的实践经验。以下是一些在RNN和CNN模型调参中积累的经验,希望对正在这个领域摸索的朋友们有所帮助。 1. 从成熟的开源项目开始 对于初学者来说&…...