Spring Boot @Validated 和Javax的@Valid配合使用
一、@Validated 和@Valid有什么用
@Validation 和@Valid 常常配合使用对传输的参数进行数据校验的注解,并通过配置全局异常处理器进行合理化的提示,增加用户的体验
并且@Validated可以通过分组来指定什么时候触发什么样的参数校验(这里看一下就行,下面有说什么是分组)
二、为什么要使用@Validated 和@Valid的思考?
其实不用这两个注解也可以完成对传输的参数进校验,那样我们就需要一直写if语句进行判断 ,如果不为xxx,抛出异常,然后进行捕获处理
但是当多处都用到的一样的传输参数的时候,我们每次都需要写一些重复的if进行校验,其实代码是不优雅的。因此有了这两个组件来帮我们进行传输参数的校验。
三、使用方法
3.1 引入pom
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--validator请求参数校验--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--测试方法--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId></dependency></dependencies>
3.2 写实体类加入一写校验注解
常用的校验注解

package com.sofwin.validator.domain;import com.sofwin.validator.config.InsertGroup;
import com.sofwin.validator.config.Status;
import com.sofwin.validator.config.UpdateGroup;
import lombok.Data;
import org.hibernate.validator.constraints.Range;
import org.springframework.web.bind.annotation.Mapping;import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.math.BigDecimal;
import java.util.List;/*** @packageName: com.sofwin.validator.domain* @author: wentao* @date: 2023/9/4 21:17* @version: 1.0* @email 1660420659@qq.com* @description: 测试*/
@Data
public class UserR {@NotBlank(message = "名称不能为空")private String name;@NotNull(message = "年龄不能为空")@Range(min = 1,max = 200,message ="最小为{min}岁,最大为{max}岁" )private Integer age;@Size(message ="编号长度为 [4-8] ", min = 4, max = 8)private String idNo;}
3.3 编写controller层进行测试 (请求参数是对象)
注意需要在请求参数的前面加上@Valid注解
统一返回类
package com.sofwin.validator.config;import lombok.Data;/*** @packageName: com.sofwin.validator.config* @author: wentao* @date: 2023/9/4 21:34* @version: 1.0* @email 1660420659@qq.com* @description: 统一返回参数*/
@Data
public class BaseResult<T> {private int code;private String message;private T data;public BaseResult() {}public BaseResult(int code, T data,String message) {this.code = code;this.message = message;this.data = data;}public static <T> BaseResult<T> build(int code, T data, String message) {return new BaseResult<T>(code,data,message);}public static <T> BaseResult<T> build( T data, BaseResult resultCodeEnum) {return new BaseResult<T>(resultCodeEnum.getCode(),data,resultCodeEnum.getMessage());}public static <T> BaseResult<T> ok(T data) {return new BaseResult<>(20000,data,"success");}public static <T> BaseResult<T> fail(T data) {return new BaseResult<>(50000,data,"error");}}
controller
package com.sofwin.validator.controller;import com.sofwin.validator.config.BaseResult;
import com.sofwin.validator.config.InsertGroup;
import com.sofwin.validator.domain.UserR;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;import javax.validation.Valid;
import javax.validation.constraints.NotNull;/*** @packageName: com.sofwin.validator.controller* @author: wentao* @date: 2023/9/4 21:14* @version: 1.0* @description: 请求参数校验*/@RestController
@RequestMapping("validator")
public class ValidatorController {@PostMapping("/validPost")public BaseResult validPostTest(@Valid @RequestBody UserR user ) {return BaseResult.ok(user);}}
正常参数

非正常参数

我们发现没有提示我们在实体中message中写的提示信息,是因为我们没有设置全局异常处理器
,它只是在控制台返回了提示信息
2023-09-05 21:24:03.305 WARN 20924 --- [nio-8080-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] in public com.sofwin.validator.config.BaseResult com.sofwin.validator.controller.ValidatorController.validPostTest(com.sofwin.validator.domain.UserR): [Field error in object 'userR' on field 'age': rejected value [1111]; codes [Range.userR.age,Range.age,Range.java.lang.Integer,Range]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [userR.age,age]; arguments []; default message [age],200,1]; default message [最小为1岁,最大为200岁]] ]
全局异常处理器
package com.sofwin.validator.config;import lombok.extern.slf4j.Slf4j;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.util.Set;
import org.slf4j.Logger;/*** @packageName: com.sofwin.validator.config* @author: wentao* @date: 2023/9/4 21:28* @version: 1.0* @email 1660420659@qq.com* @description: 全局异常处理器*/@RestControllerAdvice
@Slf4j
public class GlobExceptionHandeler {private final Logger logger = LoggerFactory.getLogger(getClass());//valid参数校验出现异常@ExceptionHandler(BindException.class)public BaseResult bindException(BindException e) {logger.error("valid参数校验出现异常");System.out.println(e);return BaseResult.build(441,null,e.getBindingResult().getAllErrors().get(0).getDefaultMessage());}//validated参数校验出现异常@ExceptionHandler(ConstraintViolationException.class)public BaseResult constraintViolationException(ConstraintViolationException e) {logger.error("validated参数校验出现异常");return BaseResult.build(441,null,e.getLocalizedMessage().split(":")[1].trim());}@ExceptionHandler(Exception.class)public BaseResult constraintViolationException(Exception e) {logger.error("Exception");return BaseResult.build(441,null,e.getLocalizedMessage());}
}
加入全局异常处理器后非正常参数返回结果:

3.4 当参数不是一个对象
一定要在controller上加入@Validated才生效
@RestController
@RequestMapping("validator")
@Validated
public class ValidatorController {@PostMapping("/validPost")public BaseResult validPostTest(@Valid @RequestBody UserR user ) {return BaseResult.ok(user);}@GetMapping("/validGet1")public BaseResult validGetTest( @NotBlank(message = "名字不能为空") String name ) {return BaseResult.ok(name);}
}
3.5 分组
当我们在特定情况下才进行参数校验才进行分组,例如只有当我们插入的时候我们进行校验,其他时候不进行参数的校验,这个时候就可以使用分组
实体类
package com.sofwin.validator.domain;import com.sofwin.validator.config.InsertGroup;
import com.sofwin.validator.config.Status;
import com.sofwin.validator.config.UpdateGroup;
import lombok.Data;
import org.hibernate.validator.constraints.Range;
import org.springframework.web.bind.annotation.Mapping;import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.math.BigDecimal;
import java.util.List;/*** @packageName: com.sofwin.validator.domain* @author: wentao* @date: 2023/9/4 21:17* @version: 1.0* @email 1660420659@qq.com* @description: 测试*/
@Data
public class UserR {@NotBlank(message = "名称不能为空")//进行分组@NotBlank(message = "名称不能为空(InsertGroup)",groups = InsertGroup.class)private String name;@NotNull(message = "年龄不能为空")@NotNull(message = "年龄不能为空(InsertGroup)",groups = {InsertGroup.class,UpdateGroup.class})@Range(min = 1,max = 200,message ="最小为{min}岁,最大为{max}岁" )private Integer age;@Size(message ="编号长度为 [4-8] ", min = 4, max = 8)private String idNo;}
其中InsertGroup和UpdateGroup只是一个普通的接口
public interface InsertGroup {}public interface UpdateGroup {}
controller
package com.sofwin.validator.controller;import com.sofwin.validator.config.BaseResult;
import com.sofwin.validator.config.InsertGroup;
import com.sofwin.validator.domain.UserR;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;/*** @packageName: com.sofwin.validator.controller* @author: wentao* @date: 2023/9/4 21:14* @version: 1.0* @description: 请求参数校验*/@RestController
@RequestMapping("validator")
@Validated
public class ValidatorController {@PostMapping("/validPost")public BaseResult validPostTest(@Valid @RequestBody UserR user ) {return BaseResult.ok(user);}@PostMapping("/validPost2")public BaseResult validPostTest2(@Validated(InsertGroup.class) @RequestBody UserR user ) {return BaseResult.ok(user);}@GetMapping("/validGet1")public BaseResult validGetTest( @NotBlank(message = "名字不能为空") String name ) {return BaseResult.ok(name);}@GetMapping("/validGet2")public BaseResult validGetTest2(@Validated(InsertGroup.class) @NotNull(message = "名字不能为空") String name ) {return BaseResult.ok(name);}
}
测试
validPost2、validGet2
validPost2


validGet2

3.6 自定义注解
当它提供的注解我们没有办法解决我们的问题的时候,我们就可以自定义注解
定义注解Status
package com.sofwin.validator.config;import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;/*** @packageName: com.sofwin.validator.config* @author: wentao* @date: 2023/9/4 21:52* @version: 1.0* @email 1660420659@qq.com* @description: 自定义校验注解*/
@Target({ElementType.FIELD,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
//自己写校验规则
@Constraint(validatedBy = {StatusConstraint.class})
//元注解 可以分组使用,如果不写定义相同的注解会出现错误
@Repeatable(Status.List.class)
public @interface Status {String[] statusType() default {};String message() default "状态传递有误";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};@Target({ElementType.FIELD,ElementType.PARAMETER})@Retention(RetentionPolicy.RUNTIME)@Documented@interface List {Status[] value();}}
校验规则
package com.sofwin.validator.config;import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.lang.annotation.Annotation;
import java.util.Arrays;
import java.util.List;/*** @packageName: com.sofwin.validator.config* @author: wentao* @date: 2023/9/4 22:04* @version: 1.0* @email 1660420659@qq.com* @description: 自定义校验柜子*/
public class StatusConstraint implements ConstraintValidator<Status,Integer> {List<String> statusType;/*** 一般进行初始化* @param constraintAnnotation*/@Overridepublic void initialize(Status constraintAnnotation) {String[] strings = constraintAnnotation.statusType();statusType = Arrays.asList(strings);}/**** @param value 参数的值* @param context* @return true 通过不抛出异常 fasle不通过抛出异常*/@Overridepublic boolean isValid(Integer value, ConstraintValidatorContext context) {if (value !=null) {if (!statusType.contains(String.valueOf(value))) {return false;}return true;}return false;}
}
测试
实体类
package com.sofwin.validator.domain;import com.sofwin.validator.config.InsertGroup;
import com.sofwin.validator.config.Status;
import com.sofwin.validator.config.UpdateGroup;
import lombok.Data;
import org.hibernate.validator.constraints.Range;
import org.springframework.web.bind.annotation.Mapping;import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.math.BigDecimal;
import java.util.List;/*** @packageName: com.sofwin.validator.domain* @author: wentao* @date: 2023/9/4 21:17* @version: 1.0* @email 1660420659@qq.com* @description: 测试*/
@Data
public class UserR {@NotBlank(message = "名称不能为空")//进行分组@NotBlank(message = "名称不能为空(InsertGroup)",groups = InsertGroup.class)private String name;@NotNull(message = "年龄不能为空")@NotNull(message = "年龄不能为空(InsertGroup)",groups = {InsertGroup.class,UpdateGroup.class})@Range(min = 1,max = 200,message ="最小为{min}岁,最大为{max}岁" )private Integer age;@Status(statusType = {"1","2"})private Integer status;@Size(message ="编号长度为 [4-8] ", min = 4, max = 8)private String idNo;}
controller
@PostMapping("/validPost")public BaseResult validPostTest(@Valid @RequestBody UserR user ) {return BaseResult.ok(user);}
正常传参

非正常传参
3.7 当出现类中出现嵌套的情况
当出现嵌套的情况只需要在类的属性中在加一个注解@Valid

实体类
package com.sofwin.validator.domain;import com.sofwin.validator.config.InsertGroup;
import com.sofwin.validator.config.Status;
import com.sofwin.validator.config.UpdateGroup;
import lombok.Data;
import org.hibernate.validator.constraints.Range;
import org.springframework.web.bind.annotation.Mapping;import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.math.BigDecimal;
import java.util.List;/*** @packageName: com.sofwin.validator.domain* @author: wentao* @date: 2023/9/4 21:17* @version: 1.0* @email 1660420659@qq.com* @description: 测试*/
@Data
public class UserR {@NotBlank(message = "名称不能为空")//进行分组@NotBlank(message = "名称不能为空(InsertGroup)",groups = InsertGroup.class)private String name;@NotNull(message = "年龄不能为空")@NotNull(message = "年龄不能为空(InsertGroup)",groups = {InsertGroup.class,UpdateGroup.class})@Range(min = 1,max = 200,message ="最小为{min}岁,最大为{max}岁" )private Integer age;@Status(statusType = {"1","2"})private Integer status;@Size(message ="编号长度为 [4-8] ", min = 4, max = 8)private String idNo;//嵌套使用valid才能生效@Validprivate List<SonUser> sonUserList;
}
package com.sofwin.validator.domain;import com.sofwin.validator.config.InsertGroup;
import com.sofwin.validator.config.UpdateGroup;
import lombok.Data;import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.math.BigDecimal;/*** @packageName: com.sofwin.validator.domain* @author: wentao* @date: 2023/9/4 21:17* @version: 1.0* @email 1660420659@qq.com* @description: 测试*/
@Data
public class SonUser {@NotBlank(message = "sonName不能为空")private String sonName;}
controller
@PostMapping("/validPost")public BaseResult validPostTest(@Valid @RequestBody UserR user ) {return BaseResult.ok(user);}

四、 总结
@Valid:没有分组的功能。
@Valid:可以用在方法、构造函数、方法参数和成员属性(字段)上
@Validated:提供了一个分组功能,可以在入参验证时,根据不同的分组采用不同的验证机制
@Validated:可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上
两者是否能用于成员属性(字段)上直接影响能否提供嵌套验证的功能
相关文章:
Spring Boot @Validated 和Javax的@Valid配合使用
一、Validated 和Valid有什么用 Validation 和Valid 常常配合使用对传输的参数进行数据校验的注解,并通过配置全局异常处理器进行合理化的提示,增加用户的体验 并且Validated可以通过分组来指定什么时候触发什么样的参数校验(这里看一下就行…...
论文复现--lightweight-human-pose-estimation-3d-demo.pytorch(单视角多人3D实时动作捕捉DEMO)
分类:动作捕捉 github地址:https://github.com/Daniil-Osokin/lightweight-human-pose-estimation-3d-demo.pytorch 所需环境: Windows10,conda 4.13.0; 目录 conda环境配置安装Pytorch全家桶安装TensorRT(…...
在Windows下设置将EXE开机自启动
在Windows下设置将EXE开机自启动,有多种方法。以下是两种常用的方法: 方法一:通过注册表 打开“运行”(快捷键:Win R),输入:reg add HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windo…...
反序列化漏洞及漏洞复现
文章目录 渗透测试漏洞原理不安全的反序列化1. 序列化与反序列化1.1 引例1.2 序列化实例1.2.1 定义一个类1.2.2 创建对象1.2.3 反序列化1.2.4 对象注入 2. 漏洞何在2.1 漏洞触发 3. 反序列化漏洞攻防3.1 PHP反序列化实例3.1.1 漏洞利用脚本3.1.2 漏洞利用3.1.3 获取GetShell 3.…...
软件工程笔记001
2023年9月5日,周二上午 软件工程的目标 软件工程的目标是成功地开发一个软件: 较低的开发成本能按时交付软件开发出来的软件该有的功能都有开发出来的软件运行效率高开发出来的软件可靠性高开发出来的软件易于维护 软件的生存周期 概念 软件生存周期…...
java进行系统的限流实现--Guava RateLimiter、简单计数、滑窗计数、信号量、令牌桶
本文主要介绍了几种限流方法:Guava RateLimiter、简单计数、滑窗计数、信号量、令牌桶,漏桶算法和nginx限流等等 1、引入guava集成的工具 pom.xml 文件 <dependency><groupId>com.google.guava</groupId><artifactId>guava<…...
《86盒应用于家居中控》——实现智能家居的灵动掌控
近年来,智能家居产品受到越来越多消费者的关注,其便捷、舒适的生活方式让人们对未来生活充满期待。作为智能家居方案领域的方案商,启明智显生产设计的86盒凭借出色的性能和良好的用户体验,成功应用于家居中控系统,让家…...
【LeetCode】328. 奇偶链表
328. 奇偶链表(中等) 思路 如果链表为空,则直接返回链表。 对于原始链表,每个节点都是奇数节点或偶数节点。头节点是奇数节点,头节点的后一个节点是偶数节点,相邻节点的奇偶性不同。因此可以将奇数节点和偶…...
数字城市:科技革命下的未来之城
随着科技的不断进步,数字城市已经成为了未来城市发展的关键趋势。数字城市是指利用先进的信息技术、互联网和大数据等工具,将城市各个方面进行数字化、智能化、互联化的发展模式。它不仅仅是一种技术,更是一种对城市管理、发展和居民生活方式…...
Qt鼠标点击事件处理:按Escape键退出程序
创建项目 Qt 入门实战教程(目录) 首先,创建一个名称为QtKeyEscape的Qt默认的窗口程序。 参考 :Qt Creator 创建 Qt 默认窗口程序 Qt响应键盘Escape事件 打开Qt Creator >>编辑 >> 项目 >> Headers>> …...
P1162 填涂颜色
填涂颜色 - 洛谷 这个题用逆向思维,见不用染色的地方标记。 这里为了处理一些情况,将图周围一圈的0空出来,用于吧围墙之外的部分都标记上 用宽搜,四联通,感觉好奇怪,八连通ac不了 #include <iostrea…...
Vagrant命令
文章目录 1.介绍2.下载3. 配置3.1 配置环境变量3.2 在xshell中连接使用 4. 相关命令4.1 Box相关4.2 初始化环境4.4 虚拟机相关 1.介绍 Vagrant 是一个虚拟机管理工具 2.下载 https://www.vagrantup.com/ 3. 配置 3.1 配置环境变量 测试安装是否成功 3.2 在xshell中连接使…...
vue3+pinia实现动态类名及动态颜色
前提 store下models下有个before.ts文件 import { defineStore } from "pinia"; export const usebeforeloggininStore defineStore("counterStore", {state: () > ({beforelogin_params: [{type: "A登录",color: "#000",flag: 1,…...
CSS实现隐藏滚动条但可以滚动
场景 隐藏滚动条,但可以滚动 解决 全局样式 /* 隐藏滚动条 */ .outer-container::-webkit-scrollbar {width: 0; /* 设置滚动条的宽度为0 */background-color: transparent; /* 设置滚动条背景为透明 */ }/* 自定义滚动条轨道样式 */ .outer-container::-webkit…...
Ceph入门到精通-lunix将文本5行合成1行并按列统计
要将每5行合并为1行,您可以使用shell命令来完成。假设您有一个名为text.txt的文本文件,您可以使用以下命令来实现: bash cat text.txt | paste -d - - - - - 这将把文件中的每5行合并为1行,并且每个字段之间用空格分隔开来。您…...
linux线程讲解
1.线程概述 一个进程在同一时刻只做一件事情,进程是程序执行的一个实例。 线程是操作系统能够进行运算调度的最小单位,一个进程中可以并发多个线程,每条线程并行执行不同的任务。 进程:资源分配的最小单位。线程,程…...
解决本地jar包导入maven
1、确定是否安装maven 2、输入导入命令 命令说明 <path-to-file>为你jar包所在的路径(尽量简单并且不要含中文) <group-id>为grouId号,与<artifact-id>组成唯一识别你jar包的坐标,当不在公共资源jar包中&#…...
ArcGis地图
1、概述 官网:https://developers.arcgis.com/qt/ 官网:官网指导 官网:Add graphics to a map view Arcgis runtime sdk for Qt 开发记录(系列文章) 2、创建地图 //online: m_mapView new MapGraphicsV…...
Chrome 和 Edge 上出现“status_breakpoint”错误解决办法
文章目录 STATUS_BREAKPOINTSTATUS_BREAKPOINT报错解决办法Chrome浏览器 Status_breakpoint 错误修复- 将 Chrome 浏览器更新到最新版本- 卸载不再使用的扩展程序和应用程序- 安装计算机上可用的任何更新,尤其是 Windows 10- 重启你的电脑。 Edge浏览器 Status_brea…...
华为AP升级操作记录
AP型号:AP4050DN 原版本:AP4050DN CLOUD V200R008C10SPC700 升级后版本:AP4000 V200R019C00SPC913 开启FTP,用户名:admin, 密码:123456 FTP服务端地址:192.168.8.58 操作:将AP连接…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...
