java每日精进 5.14【参数校验】
参数校验
1.1概述
本文使用 Hibernate Validator 框架对 RESTful API 接口的参数进行校验,确保数据入库的正确性。
例如,在用户注册时,校验手机号格式、密码强度等。如果校验失败,抛出
ConstraintViolationException 或相关异常,由 GlobalExceptionHandler 捕获,返回标准化的 CommonResult 响应,格式如下:
{"code": 400,"data": null,"msg": "请求参数不正确:密码不能为空"
}
1.2 参数校验注解
Hibernate Validator 提供 20+ 个内置校验注解,文档将其分为常用和不常用两类:
常用注解
注解 | 功能 |
---|---|
@NotBlank | 用于字符串,确保非 null 且 trim() 后长度大于 0 |
@NotEmpty | 用于集合、字符串,确保非 null 且非空 |
@NotNull | 确保非 null |
@Pattern(value) | 符合指定正则表达式 |
@Max(value) | 值小于或等于指定值 |
@Min(value) | 值大于或等于指定值 |
@Range(min, max) | 值在指定范围内 |
@Size(max, min) | 集合、字符串等大小在范围内 |
@Length(max, min) | 字符串长度在范围内 |
@AssertTrue | 值为 true |
@AssertFalse | 值为 false |
符合邮箱格式 | |
@URL | 符合 URL 格式 |
不常用注解
注解 | 功能 |
---|---|
@Null | 必须为 null |
@DecimalMax(value) | 数字小于或等于指定值 |
@DecimalMin(value) | 数字大于或等于指定值 |
@Digits(integer, fraction) | 数字在指定位数范围内 |
@Positive | 正数 |
@PositiveOrZero | 正数或 0 |
@Negative | 负数 |
@NegativeOrZero | 负数或 0 |
@Future | 未来日期 |
@FutureOrPresent | 现在或未来日期 |
@Past | 过去日期 |
@PastOrPresent | 现在或过去日期 |
@SafeHtml | 安全的 HTML 内容 |
1.3 参数校验使用过程
文档提到,只需三步即可启用参数校验:
第零步:引入依赖
- 项目默认引入 spring-boot-starter-validation,无需手动添加:
xml
Copy
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
- 提供 Hibernate Validator 的核心功能。
第一步:在类上添加 @Validated
- 在需要校验的类(如 Controller 或 Service)上添加 @Validated 注解,启用校验:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId> </dependency>
- 作用:通知 Spring 在方法调用时对参数进行校验。
- 注意:Service 层也需校验,因为 Service 可能被其他 Service 调用,参数可能不正确。
第二步:添加校验注解
分为两种情况:
情况一:Bean 类型参数
- 在方法参数上添加 @Valid,在 Bean 属性上添加校验注解:
// Controller 示例 @Validated @RestController public class AuthController {// ... }// Service 示例(实现类) @Service @Validated public class AdminAuthServiceImpl implements AdminAuthService {// ... }
- 解析:
- @Valid:触发对 AuthLoginReqVO 对象的属性校验。
- @NotEmpty:确保字段非 null 且非空字符串。
- @Length:限制字符串长度在 4-16 位。
- @Pattern:确保用户名只包含字母和数字。
- 如果校验失败,抛出 MethodArgumentNotValidException,由 GlobalExceptionHandler 处理。
情况二:普通类型参数
- 直接在方法参数上添加校验注解:
// Controller 示例 @Validated @RestController public class DictDataController {@GetMapping("/get")public CommonResult<DictDataRespVO> getDictData(@RequestParam("id") @NotNull(message = "编号不能为空") Long id) {// ...} }// Service 接口示例 public interface DictDataService {DictDataDO getDictData(@NotNull(message = "编号不能为空") Long id); }
- 解析:
- @NotNull:确保 id 非 null。
- 校验失败抛出 ConstraintViolationException,由 GlobalExceptionHandler 的 constraintViolationExceptionHandler 捕获:
@ExceptionHandler(value = ConstraintViolationException.class) public CommonResult<?> constraintViolationExceptionHandler(ConstraintViolationException ex) {log.warn("[constraintViolationExceptionHandler]", ex);ConstraintViolation<?> constraintViolation = ex.getConstraintViolations().iterator().next();return CommonResult.error(BAD_REQUEST.getCode(), String.format("请求参数不正确:%s", constraintViolation.getMessage())); }
第三步:测试校验效果
- 启动项目,调用 API(如 /login),故意漏填参数(如 username),检查响应:
{ "code": 400, "data": null, "msg": "请求参数不正确:登录账号不能为空" }
- 验证:确认 GlobalExceptionHandler 正确捕获异常并返回标准响应。
1.4 自定义校验注解
当内置注解不足以满足需求时,可自定义校验注解。文档以 @Mobile 注解为例:
第一步:定义 @Mobile 注解
@Target({ElementType.METHOD,ElementType.FIELD,ElementType.ANNOTATION_TYPE,ElementType.CONSTRUCTOR,ElementType.PARAMETER,ElementType.TYPE_USE
})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = MobileValidator.class
)
public @interface Mobile {String message() default "手机号格式不正确";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};}
- 解析:
- @Target:指定注解可用于字段、方法、参数等。
- @Retention:运行时保留,供校验器读取。
- @Constraint:绑定校验器 MobileValidator。
- message:自定义错误提示。
第二步:实现 MobileValidator
public class MobileValidator implements ConstraintValidator<Mobile, String> {@Overridepublic void initialize(Mobile annotation) {}@Overridepublic boolean isValid(String value, ConstraintValidatorContext context) {// 如果手机号为空,默认不校验,即校验通过if (StrUtil.isEmpty(value)) {return true;}// 校验手机return ValidationUtils.isMobile(value);}}
- 解析:
- 实现 ConstraintValidator<Mobile, String>,校验字符串类型的手机号。
- isValid:检查是否符合手机号格式(通过 ValidationUtils.isMobile,推测为正则匹配)。
- 允许空值通过,符合业务需求。
第三步:使用 @Mobile
@Data
public class AppAuthLoginReqVO {@NotEmpty(message = "手机号不能为空")@Mobile // 应用自定义注解private String mobile;
}
- 解析:
- @Mobile 校验 mobile 是否符合手机号格式。
- 校验失败抛出 ConstraintViolationException,由 GlobalExceptionHandler 处理。
1.5 校验异常处理
- 异常类型:
- Bean 参数校验失败:抛出 MethodArgumentNotValidException 或 BindException。
- 普通参数校验失败:抛出 ConstraintViolationException。
- 处理流程:
- GlobalExceptionHandler 捕获这些异常,转换为 CommonResult:
@ExceptionHandler(MethodArgumentNotValidException.class) public CommonResult<?> methodArgumentNotValidExceptionExceptionHandler(MethodArgumentNotValidException ex) {log.warn("[methodArgumentNotValidExceptionExceptionHandler]", ex);String errorMessage = ex.getBindingResult().getFieldError().getDefaultMessage();return CommonResult.error(BAD_REQUEST.getCode(), String.format("请求参数不正确:%s", errorMessage)); }
- 返回 400 状态码和用户友好的错误消息。
- GlobalExceptionHandler 捕获这些异常,转换为 CommonResult:
1.6 WebSocket 场景
- 校验方式:WebSocket 握手请求(HTTP GET)通过查询参数传递数据,可使用普通参数校验:
@Validated
@RestController
public class WebSocketController {@GetMapping("/ws/connect")public CommonResult<?> connect(@RequestParam("token") @NotEmpty(message = "token 不能为空") String token) {// ...}
}
- 异常处理:同 RESTful API,由 GlobalExceptionHandler 处理,返回 CommonResult。
- 注意:WebSocket 消息(非握手)通常不直接使用 Hibernate Validator,需手动校验或在 Service 层处理。
二、时间传参
2.1 概述
项目对时间参数的传递和响应有明确规范,根据请求类型(Query 或 Request Body)使用不同格式,响应通常以 Long 时间戳为主。以下分 Query、Request Body 和 Response Body 三部分说明。
2.2 Query 时间传参
适用于 GET 请求或 POST 的 form-data 请求。
后端代码
- 使用 @DateTimeFormat 指定时间格式:
@Data
public class JobLogPageReqVO {@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") // 指定格式private LocalDateTime beginTime;
}@Data
public class UserPageReqVO {@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") // 数组形式private LocalDateTime[] createTime;
}
- 解析:
- @DateTimeFormat:将字符串(如 2025-05-14 09:47:00)解析为 LocalDateTime。
- pattern:定义格式为 yyyy-MM-dd HH:mm:ss,与前端一致。
- 数组形式支持时间范围查询(如开始和结束时间)。
前端代码
- 前端传递格式为 yyyy-MM-dd HH:mm:ss:
- 示例(views/infra/job/logger/index.vue):
-
// 单个时间传参 beginTime: '2025-05-14 09:47:00'
- 示例(views/system/user/index.vue):
// 多个时间传参(范围) createTime: ['2025-05-14 00:00:00', '2025-05-14 23:59:59']
- 解析:前端通过查询参数(如 ?beginTime=2025-05-14+09:47:00)或 form-data 提交。
校验
- 可添加校验注解:
@NotNull(message = "开始时间不能为空") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime beginTime;
- 格式错误抛出 HttpMessageNotReadableException,由 GlobalExceptionHandler 处理。
2.3 Request Body 时间传参
适用于 POST、PUT 请求的 JSON 格式。
后端代码
- 使用 @RequestBody 接收 LocalDateTime:
@Data public class TenantCreateReqVO {@NotNull(message = "过期时间不能为空")private LocalDateTime expireTime; }@PostMapping("/create") public CommonResult<?> createTenant(@RequestBody TenantCreateReqVO reqVO) {// ... }
- 解析:
- 不需显式 @DateTimeFormat,因为 JSON 使用 Long 时间戳。
- LocalDateTime 通过自定义反序列化器处理。
前端代码
- 传递 Long 时间戳:
- 示例(views/system/tenant/TenantForm.vue):
expireTime: 1744558020000 // 对应 2025-05-14 09:47:00
- 示例(views/system/tenant/TenantForm.vue):
- 解析:前端将时间转换为毫秒时间戳,符合后端预期。
2.4 Response Body 时间响应
- LocalDateTime 字段序列化为 Long 时间戳:
@Data public class TenantRespVO { private LocalDateTime createTime; }
- 响应示例:
{ "code": 0, "data": { "createTime": 1744558020000 }, "msg": "success" }
2.5 自定义 JSON 时间格式
作用范围(前端 POST/PUT 请求发送 JSON 数据时,包含 LocalDateTime
字段,后端返回包含 LocalDateTime
的 Java 对象时),上文Request Body 时间传参 和 Response Body 时间响应 的处理主要依赖于 自定义 JSON 时间格式,而 Query 时间传参 则依赖 @DateTimeFormat 注解来解析字符串格式的时间。
为什么使用 Long 时间戳?
- 原因:
- Long 时间戳是标准格式,无格式歧义(如 yyyy-MM-dd vs yyyy/MM/dd)。
- 前端可通过 format 方法灵活展示任意格式,规范性强。
- 实现:
- 使用自定义序列化器和反序列化器:
/*** 基于时间戳的 LocalDateTime 序列化器* 用于将 Java 8 的 LocalDateTime 对象序列化为 Unix 时间戳(毫秒级)*/ public class TimestampLocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {// 单例实例,避免重复创建public static final TimestampLocalDateTimeSerializer INSTANCE = new TimestampLocalDateTimeSerializer();/*** 将 LocalDateTime 对象序列化为时间戳(毫秒)* * @param value 待序列化的 LocalDateTime 对象* @param gen JSON 生成器,用于输出 JSON 内容* @param serializers 序列化器提供程序,可用于获取上下文信息* @throws IOException 当 JSON 生成过程中发生 I/O 错误时抛出*/@Overridepublic void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {// 1. 将 LocalDateTime 转换为系统默认时区的 ZonedDateTime// LocalDateTime 本身不带时区信息,需要通过 ZoneId.systemDefault() 获取系统默认时区// 例如:2023-01-01T12:00:00 + 系统时区(如 Asia/Shanghai) = 2023-01-01T12:00:00+08:00[Asia/Shanghai]ZonedDateTime zonedDateTime = value.atZone(ZoneId.systemDefault());// 2. 将 ZonedDateTime 转换为 Instant(时间线上的一个点,UTC 时间)// 例如:2023-01-01T12:00:00+08:00[Asia/Shanghai] -> 2023-01-01T04:00:00ZInstant instant = zonedDateTime.toInstant();// 3. 将 Instant 转换为 Unix 时间戳(自 1970-01-01T00:00:00Z 以来的毫秒数)// 例如:2023-01-01T04:00:00Z -> 1672545600000long timestamp = instant.toEpochMilli();// 4. 将时间戳写入 JSON 输出流gen.writeNumber(timestamp);} } /*** 基于时间戳的 LocalDateTime 反序列化器*/ public class TimestampLocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {public static final TimestampLocalDateTimeDeserializer INSTANCE = new TimestampLocalDateTimeDeserializer();@Overridepublic LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {// 将 Long 时间戳,转换为 LocalDateTime 对象return LocalDateTime.ofInstant(Instant.ofEpochMilli(p.getValueAsLong()), ZoneId.systemDefault());}}
- 配置在 YudaoJacksonAutoConfiguration 中:
@Bean public ObjectMapper objectMapper() {ObjectMapper mapper = new ObjectMapper();SimpleModule module = new SimpleModule();module.addSerializer(LocalDateTime.class, new TimestampLocalDateTimeSerializer());module.addDeserializer(LocalDateTime.class, new TimestampLocalDateTimeDeserializer());mapper.registerModule(module);return mapper; }
- 使用自定义序列化器和反序列化器:
全局配置时间格式
- 配置 LocalDateTimeSerializer 和 LocalDateTimeDeserializer:
@Bean public ObjectMapper objectMapper() {ObjectMapper mapper = new ObjectMapper();SimpleModule module = new SimpleModule();module.addSerializer(LocalDateTime.class, new TimestampLocalDateTimeSerializer());module.addDeserializer(LocalDateTime.class, new TimestampLocalDateTimeDeserializer());mapper.registerModule(module);return mapper; }
- 效果:所有 LocalDateTime 字段以 yyyy-MM-dd HH:mm:ss 格式序列化。
局部配置时间格式
- 使用 @JsonFormat:
@Data public class UserRespVO {@JsonSerialize(using = LocalDateTimeSerializer.class)@JsonDeserialize(using = LocalDateTimeDeserializer.class)@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private LocalDateTime createTime; }
- 效果:仅 createTime 字段使用指定格式。
相关文章:
java每日精进 5.14【参数校验】
参数校验 1.1概述 本文使用 Hibernate Validator 框架对 RESTful API 接口的参数进行校验,确保数据入库的正确性。 例如,在用户注册时,校验手机号格式、密码强度等。如果校验失败,抛出 ConstraintViolationException 或相关异…...
CPS联盟+小程序聚合平台分销返利系统开发|小红书番茄网盘CPA拉新推广全解析
导语: 在私域流量与社交电商爆发的时代,CPS联盟分销返利系统与小红书CPA拉新推广成为企业增长的核心引擎。本文深度解析如何通过小程序聚合平台开发、多层级返利机制搭建及精准CPA推广策略,快速占领市场,实现用户裂变与收益倍增。…...
基于EFISH-SCB-RK3576/SAIL-RK3576的光伏逆变器控制器技术方案
(国产化替代J1900的能源物联网解决方案) 一、硬件架构设计 电力转换与控制模块 高精度功率控制: Cortex-M0硬实时核驱动多相PWM(频率>200kHz),动态调节DC-AC转换误差<0.5%FPGA实现MPPT算法…...
HarmonyOS NEXT 适配高德地图FlutterSDK实现地图展示,添加覆盖物和移动Camera
HarmonyOS NEXT 适配高德地图 Flutter SDK 实现地图展示,添加覆盖物和移动 Camera 在现代移动应用开发中,地图功能是许多应用的核心组成部分之一。HarmonyOS NEXT 提供了强大的跨平台开发能力,而高德地图 Flutter SDK 则为开发者提供了丰富的…...
计算机网络:手机和基站之间是通过什么传递信息的?怎么保证的防衰减,抗干扰和私密安全的?
手机与基站之间的通信依赖无线电磁波信号,其传输介质、频率选择、抗衰减/抗干扰技术及隐私保护机制共同构成了现代移动通信的核心。以下从技术原理到实际应用逐一解析: 一、信号本质与传输介质 1. 信号类型 电磁波:手机与基站通过射频(RF)电磁波传递信息,采用数字调制技…...
C#调用C++dll 过程记录
C#调用Cdll 过程记录 问题:1、设置修改记录2 修改对应问题3 继续出问题4 许久之后的转机5 最后的成功 如题,过程记录 问题: 提示:main 已经在 dllmain.obj 中定义,针对该问题作进一步的处理 1、设置修改记录 &…...
Vue百日学习计划Day4-8——Gemini版
番茄时钟: 每个番茄钟为25分钟学习,之后休息5分钟。每完成4个番茄钟,进行一次15-30分钟的长休息。灵活性: 这仍然是一个建议性计划。某些主题(尤其是 Flexbox 和 Grid)可能需要比预期更多的时间来练习和理解…...
DHCP协议
DHCP协议 1、掌握DHCP的工作原理 2、会在Windows server上去部署DHCP服务 3、抓流量 正常收到攻击后 一、DHCP 1、DHCP基本概念 dhcp(动态主机配置协议):主要就是给客户机提供TCP/IP参数(IP地址、子网掩码、网关、DNS等) 2、好处 减少管理员工作…...
级联与端到端对话系统架构解析:以Moshi为例
一、对话系统架构对比 1.1 级联对话系统(Cascaded Dialogue Systems) 传统级联系统采用多阶段处理流程: 语音识别(ASR):将24kHz音频信号通过卷积神经网络(CNN)和Transformer转换为…...
3、ubantu系统docker常用命令
1、自助查看docker命令 1.1、查看所有命令 docker 客户端非常简单,可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项。 angqiangwangqiang:~$ dockerUsage: docker [OPTIONS] COMMANDA self-sufficient runtime for containersCommon Commands:ru…...
【leetcode】349. 两个数组的交集
文章目录 代码1.set()2. 哈希表3. 数组 给定两个数组 nums1 和 nums2 ,返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1: 输入:nums1 [1,2,2,1], nums2 [2,2] 输…...
BGP联邦和发射试验
一、要求 二、需求分析 1. **拓扑与地址规划** - **AS1**:环回16.1.1.0/24需宣告,192.168.1.0/24不宣告。 - **AS3**:环回11.1.1.0/24需宣告,192.168.2.0/24不宣告。 - **AS2**:使用172.16.0.0/16划分子…...
LeetCode Hot100 (1/100)
目录 一、有关数组和动态数组的排序(sort函数) 1.普通数组的排序 基本用法 降序排序 2.vector的排序 基本用法 降序排序 二、数组长度和一些vector的基本语法 1. 静态数组长度计算 2. 安全获取数组长度(C17 起) 3.vecto…...
LeetCode热题100--234.回文链表--简单
1. 题目 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 示例 1: 输入:head [1,2,2,1] 输出:true 示例 2: 输入…...
Java—接口和抽象类
一、接口 Java 接口(Interface) 是面向对象编程中用于定义行为规范的核心机制。接口通过抽象方法约定“能做什么”,而不关心“如何做”,从而实现多态和代码解耦。 1.1 接口的特点 接口用interface定义接口中全为抽象方法默认用p…...
CycleISP: Real Image Restoration via Improved Data Synthesis通过改进数据合成实现真实图像恢复
摘要 大规模数据集的可用性极大释放了深度卷积神经网络(CNN)的潜力。然而,针对单图像去噪问题,获取真实数据集成本高昂且流程繁琐。因此,图像去噪算法主要基于合成数据开发与评估,这些数据通常通过广泛假设…...
算法题(146):最大子段和
、 审题: 本题需要我们找到给定数组中子段之和和最大的sum值 思路: 方法一:暴力解法 我们可以使用双层for循环,第一层循环负责遍历每一个数组元素,然后分别以他们为子段起点,第二层循环从第一层循环的索引开…...
centos6.10在Macbook m芯片上使用
非常好!用 CentOS 6.10 替代 6.4 是一个明智的选择 ✅,原因如下: ⸻ ✅ 为什么选 CentOS 6.10 更好 对比项 CentOS 6.4 CentOS 6.10 发布年份 2013 年 2018 年(CentOS 6 系列最终版) 内核版本 2.6.32-358 2.6.32-75…...
OA 系统办公自动化包含哪些内容,关键功能模块与操作要点说明
在企业数字化转型浪潮中,OA 系统常被片面认知为请假审批、文件收发的工具,未能发挥其核心价值。部分企业引入 OA 后,出现员工抵触、流程卡顿、系统闲置等问题,根源在于对其功能定位模糊、应用模式僵化,导致无法实现预期…...
AI智能体的现状和应用前景
AI智能体的现状 AI智能体(AI Agents)是指能够感知环境、做出决策并执行任务的智能系统。它们通常结合了机器学习、自然语言处理、计算机视觉等技术,能够在复杂环境中自主运行。目前,AI智能体已经在多个领域取得了显著进展。 在工业领域,AI智能体被用于自动化生产线、质量…...
操作系统实验 实验3 存储器分配与回收
1.实验目的 了解动态分区分配方式中使用的数据结构和分配算法,并进一步加深动态分区存储管理方式及其实现过程的理解。 2.实验要求 用C语言实现首次适应算法的动态分区分配过程alloc()和回收过程free()。 一、实验内容: 1.实验内容 用C语言实…...
408考研逐题详解:2009年第13题
2009年第13题 浮点数加、减运算过程一般包括对阶、尾数运算、规格化、舍入和判溢出等步骤。设浮点数的阶码和尾数均采用补码表示,且位数分别为 5 位和 7 位(均含 2 位符号位)。若有两个数 X 2 7 29 / 32 X2^7\times29/32 X2729/32, Y 2 …...
什么是虚拟同步发电机
虚拟同步发电机(Virtual Synchronous Generator, VSG) 是一种基于电力电子技术的先进控制策略,通过模拟传统同步发电机的机电特性和动态行为,使逆变器或储能系统能够像传统发电机一样为电网提供惯性支撑、频率调节和电压稳定性支持…...
性能比拼: Linkerd vs. Istio
本内容是对知名性能评测博主 Anton Putra Linkerd vs. Istio (Rust vs. C) performance benchmark 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 在本内容中,我们将对比 Kubernetes 服务网格中的 Istio 和 Linkerd。 相关代码详见 github 我们将运行…...
FPGA: Xilinx Kintex 7实现PCIe接口
在Xilinx Kintex-7系列FPGA上实现PCIe(Peripheral Component Interconnect Express)接口,通常使用Xilinx提供的7 Series Integrated Block for PCIe IP核,结合Vivado设计流程。以下是实现PCIe接口的详细步骤和关键点,适…...
《Effective Python》第2章 字符串和切片操作——Python 字符串格式化的现代选择f-strings
引言 本篇博客基于学习《Effective Python》第三版 Chapter 2: Strings and Slicing 的 Item 11 “Prefer Interpolated F-Strings Over C-style Format Strings and str.format” 的总结与延伸。 字符串格式化是 Python 编程中的常见操作,用于动态生成可读性高的…...
vue 去掉右边table的下拉条与下面的白色边框并补充满
::v-deep table {width: 100% !important; } ::v-deep .el-table::after, .el-table::before {display: none !important; }/* 隐藏滚动条但保留滚动功能 */ ::v-deep .el-table__body-wrapper::-webkit-scrollbar {width: 0 !important;height: 0 !important; }::v-deep .el-t…...
RabbitMq消息阻塞,立即解决方案
如果目前你的 RabbitMQ 消费者 被卡住不再消费消息,且消息已经到达消费者绑定队列,但Spring Cloud Stream 没有继续触发 StreamListener 的方法执行。这类问题一般是因为消费者线程阻塞或消息被 RabbitMQ 拒绝投递。我们可以按照下面的步骤紧急处理&…...
单片机-STM32部分:14、SPI
飞书文档https://x509p6c8to.feishu.cn/wiki/VYYnwOc9Zi6ibFk36lYcPQdRnlf 什么是SPI SPI 是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola(摩托罗拉)首先在其MC68HCXX系列处理器上定义的。 SPI,是一种高速的&…...
Selenium-Java版(操作元素)
选择和操控元素的基本方法 前言 选择元素 选择元素的方法 根据 id属性选择元素 根据class属性选择元素 根据tag名选择元素 通过WebElement对象选择元素 示例 等待界面元素出现 原因 解决 操控元素 点击元素 输入框 获取元素信息 获取元素文本内容 获取…...
20052012世界银行中国企业调查数据-社科数据
2005&2012世界银行中国企业调查数据-社科数据https://download.csdn.net/download/paofuluolijiang/90623828https://download.csdn.net/download/paofuluolijiang/90623828 世界银行中国企业调查数据(World Bank Enterprise Surveys Data)是国际金…...
学习黑客NFC技术详解
NFC技术详解:近距离通信的无线桥梁 📱💳 学习目标:了解NFC技术的基本原理、应用场景及安全注意事项,掌握这一日益普及的近场通信技术 1. NFC的概念与基础 📡 NFC(Near Field Communication&…...
Java问题排查常用命令行工具速查表
Java问题排查常用命令行工具速查表 工具典型用途常用命令示例说明/场景jps列出本机所有Java进程jps -l获取Java进程PID和主类名,配合其它工具使用jcmd动态诊断、堆heap dump、线程dump等jcmd helpjcmd VM.flagsjcmd GC.heap_infojcmd Thread.print功能最全…...
近期搬了个家,停更了几天,明天继续哈~
近期搬了个家,停更了几天,明天继续哈~ 近期搬家比较离谱,第一天下暴雨,冰雹,停电,第二天又停电两小时,截止14号晚上11:30终于完工 了,从西二的20 号楼到西三的19号楼&am…...
C#高级编程:IO和序列化
在 C# 编程中,输入输出(IO)和序列化是两个至关重要的概念,它们为数据的存储、读取以及在不同环境间的传输提供了强大的支持。无论是开发小型应用程序,还是构建复杂的企业级系统,深入理解并熟练运用 IO 和序列化技术都是必不可少的。 一、C# 中的 IO 基础 1、文件流…...
PyQt5完整指南:从入门到实践
引言 PyQt5是Python编程语言的一个GUI(图形用户界面)工具包,它是Qt5应用程序框架的Python绑定。Qt是一个跨平台的C应用程序开发框架,被广泛用于开发GUI程序和非GUI程序。PyQt5让Python开发者能够使用Python语言享受到Qt框架的强大…...
C#高级编程:加密解密
在数字化时代,数据安全是每个应用程序都必须重视的环节。无论是用户的个人信息、敏感的商业数据,还是重要的系统配置,都需要得到妥善的保护。C# 作为一种广泛应用的编程语言,提供了丰富且强大的加密解密功能,帮助开发者构建安全可靠的应用。本文将深入探讨 C# 高级编程中的…...
银行卡真伪验证助力金融合规-银行卡实名认证接口
在数字化时代,金融交易日益频繁,用户身份与银行卡信息的真实性核验成为保障资金安全、防止欺诈行为的关键环节。无论是在线支付、网络借贷、电商平台,还是社交软件、金融服务APP,均需对用户的银行卡进行严格的实名认证。为满足企业…...
html5+css3实现傅里叶变换的动态展示效果(仅供参考)
<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>傅里叶变换的动态展示效果</title><sty…...
SysConfig修改后`ti_msp_dl_config`文件未更新问题的解决方法(已解决)
SysConfig修改后ti_msp_dl_config文件未更新问题的解决方法 在使用SysConfig工具配置TI MSPM0系列MCU时,有时会遇到一个令人困惑的问题:在SysConfig中修改配置后,生成的ti_msp_dl_config.c文件内容却没有更新。这可能会导致工程无法正确编译…...
深入浅出 IPFS 在 DApps 和 NFT 中的应用:以 Pinata 实战为例
目录 IPFS背景什么是 IPFS?IPFS 在 DApps 与 NFT 中的作用什么是 Pinata?为什么使用它?使用原生IPFS上传下载文件(HTML + JavaScript 示例)使用Pinata上传下载文件(HTML + JavaScript 示例)注册并创建APIKey使用 Pinata 上传文件和JSON(HTML + JavaScript 示例)总结IP…...
深度剖析LLM的“大脑”:单层Transformer的思考模式探索
简单说一下哈 —— 咱们打算训练一个单层 Transformer 加上稀疏自编码器的小型百万参数大型语言模型(LLM),然后去调试它的思考过程,看看这个 LLM 的思考和人类思考到底有多像。 LLMs 是怎么思考的呢? 开源 LLM 出现之后…...
(4)python开发经验
文章目录 1 使用ctypes库调用2 使用pybind11 更多精彩内容👉内容导航 👈👉Qt开发 👈👉python开发 👈 1 使用ctypes库调用 说明:ctypes是一个Python内置的库,可以提供C兼容的数据类型…...
卷积神经网络全连接层详解:特征汇总、FCN替代与性能影响分析
【内容摘要】 本文聚焦卷积神经网络(CNN)的全连接层,详细介绍其将二维特征图转化为一维向量的过程,阐述全卷积网络(FCN)如何通过转置卷积替代全连接层以实现像素级分类,并分析全连接层对图像分类…...
通义千问-langchain使用构建(一)
目录 序言通义千问1获取通义千问api_key2Conda构建下本地环境3 构建一下多轮对话 LangChain1使用Langchain调用通义千问接口实现翻译 结论 序言 25年5月,现在基本每个大厂都有涉及大模型(Large Language Model),然后在大模型基础上构建应用框架。 参考…...
六西格玛觉醒:一场数据思维的启蒙运动
当生产线上的不良品率曲线第一次在我眼前具象化为统计波动图时,我意识到自己正站在新旧认知的断层带上。从对着MINITAB界面手足无措的菜鸟,到能独立完成过程能力分析的绿带学员,这段学习旅程不仅重塑了我的问题解决逻辑,更让我…...
BitMart合约交易体验 BitMart滑点全赔的底层逻辑
美国新泽西州泽西市,2025年5月13日 – BitMart,全球领先的数字资产交易平台,推出了其开创性的滑点保护计划,旨在解决加密市场中最具挑战性且常常被忽视的风险之一:滑点。该计划为交易者提供了在 USDT 保证金永续合约交…...
HCIP(BFD)
一、前言 随着网络应用的广泛部署,网络发生故障极大可能导致业务异常。为了减小链路、设备故障对业 务的影响,提高网络的可靠性,网络设备需要尽快检测到与相邻设备间的通信故障,以便及时采取措施,保证业务正常进行。BFD(Bidirectional Forwarding Detection,双向转发检测)提供…...
json-server的用法-基于 RESTful API 的本地 mock 服务
json-server 是一个非常方便的工具,用于快速搭建基于 RESTful API 的本地 mock 服务,特别适合前端开发阶段模拟后端数据接口。 🧩 一、安装 npm install -g json-server🚀 二、快速启动 创建一个 db.json 文件(模拟数…...
化工单元操作试验装置系列产品JG-SX211计算机过程控制板框过滤操作实训装置
化工单元操作试验装置系列产品JG-SX211计算机过程控制板框过滤操作实训装置 一、装置功能 板框过滤岗位技能:板框过滤机的构造和操作方法;板框压滤机的操作(装合、过滤、洗涤、卸渣、整理);洗涤速率与最终过滤速率的关…...