Springboot数据校验与异常篇
一、异常处理
1.1Http状态码
HTTP状态码是指在HTTP通信过程中,服务器向客户端返回的响应状态。它通过3位数字构成,第一个数字定义了响应的类别,后两位数字没有具体分类作用。以下是常见的HTTP状态码及其含义:
- 1xx(信息类):请求已接收,继续处理。
- 2xx(成功类):请求已成功接收、理解和处理。
- 3xx(重定向类):需要进一步操作以完成请求。
- 4xx(客户端错误类):请求包含错误或无法完成。
- 5xx(服务器错误类):服务器无法完成显然有效的请求。常见的HTTP状态码包括:
- 200(OK):请求成功。
- 301(Moved Permanently):资源的URL已永久移动。
- 404(Not Found):无法找到请求的资源。
- 500(Internal Server Error):服务器发生了未知的错误。这只是一小部分常见的HTTP状态码,实际上还有许多其他状态码。了解HTTP状态码可以帮助开发人员更好地理解请求和响应之间的交互。

详情请见有趣的小知识(一)HTTP请求响应状态码:一份不可或缺的指南,从容面对任何请求挑战!
按REST规范,服务器端发生错误/异常/无权限等,应返回相应的HTTP状态码;前端通过状态码处理异常信息
1.2异常类
- 应用可能产生的异常
- 能够在代码中,直接捕获/处理
- 转抛为自定义非受检异常
- 转抛为支持HTTP状态码的非受检异常
- 无法在代码中,直接捕获处理的。即,Spring容器处理时产生的异常
- 统一异常处常
相关代码实现
实体类
package com.handlingexception.entity;import lombok.Data;@Data
public class User {private String userName;private String password;
}
自定义异常
package com.example.springmvcexamples.example02.handlingexception.exception;import lombok.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class MyException extends RuntimeException {private int code;public MyException(int code, String message) {super(message);this.code = code;}
}
package com.handlingexception.controller;import com.handlingexception.exception.MyException;
import com.vo.ResultVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;@Slf4j
@RestControllerAdvice // 表示这是一个全局异常处理器类,可以处理控制器中抛出的所有异常
public class ExceptionController02 {// 定义一个方法,用于处理MyException类型的异常// 使用@ExceptionHandler注解,表示这个方法用于处理MyException类型的异常// 使用@ResponseStatus注解,表示当发生MyException异常时,返回的HTTP状态码为NOT_FOUND(404)@ExceptionHandler(MyException.class)@ResponseStatus(HttpStatus.NOT_FOUND)public ResultVO handleValidException(MyException exception) {// 返回一个ResultVO对象,包含错误码和错误信息return ResultVO.error(exception.getCode(), exception.getMessage());}
}
状态类
package com.vo;import lombok.Builder;
import lombok.Data;import java.util.Map;@Data
@Builder
public class ResultVO {private int code;private String message;private Map<String, Object> data;public static ResultVO success(Map<String, Object> data) {return ResultVO.builder().code(200).data(data).build();}public static ResultVO error(int code, String msg) {return ResultVO.builder().code(code).message(msg).build();}
}
package com.vo;public class Code {public static final Integer readFile_OK = 20011;public static final Integer readFile_ERR = 40110;}
服务类
package com.handlingexception.service;
import com.handlingexception.exception.MyException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;@Service
@Slf4j
public class UserService02 {public void readFile() {try {Files.readString(Path.of("A:/aa.aa"));} catch (IOException e) {throw new MyException(500, "读取文件错误!" + e.getMessage());}}
}
处理类
package com.handlingexception.controller;import com.handlingexception.entity.User;
import com.handlingexception.service.UserService02;
import com.vo.ResultVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.Map;@RestController
@RequestMapping("/api/example02/")
public class ExampleController02 {@Autowiredprivate UserService02 userService02;@GetMapping("exception")public void getException() {userService02.readFile();}@PostMapping("login")public ResultVO login(@RequestBody User user) {if (!("BO".equals(user.getUserName()) && "123456".equals(user.getPassword()))) {return ResultVO.error(401, "用户名密码错误a");}return ResultVO.success(Map.of());}}
测试
GET http://localhost:8080/api/example02/exception
Accept: application/json
相关注解解析
@ControllerAdvice
`@ControllerAdvice`注解是Spring框架中的一个注解,用于定义全局的异常处理类。当控制器中的方法抛出异常时,`@ControllerAdvice`注解的类中的处理方法会被调用,从而实现全局异常处理。
使用`@ControllerAdvice`注解需要以下步骤:
1. 创建一个类,并使用`@ControllerAdvice`注解标注该类。
2. 在该类中定义处理方法,可以使用`@ExceptionHandler`注解来指定处理特定类型的异常。
3. 在处理方法中编写异常处理逻辑,例如记录日志、返回自定义的错误信息等。以下是一个简单的示例:
import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.http.HttpStatus;// 使用@ControllerAdvice注解,表示这是一个全局异常处理器类 @ControllerAdvice public class GlobalExceptionHandler {// 处理所有异常// 当发生异常时,会调用这个方法进行处理// @ExceptionHandler(Exception.class)表示处理所有类型的异常// @ResponseBody表示将方法的返回值作为响应体发送给客户端// @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)表示设置响应状态码为500(内部服务器错误)@ExceptionHandler(Exception.class)@ResponseBody@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)public String handleAllExceptions(Exception e) {// 返回一个包含异常信息的字符串return "服务器内部错误:" + e.getMessage();}// 处理特定类型的异常,例如NullPointerException// 当发生NullPointerException时,会调用这个方法进行处理// @ExceptionHandler(NullPointerException.class)表示处理NullPointerException类型的异常// @ResponseBody表示将方法的返回值作为响应体发送给客户端// @ResponseStatus(HttpStatus.BAD_REQUEST)表示设置响应状态码为400(错误的请求)@ExceptionHandler(NullPointerException.class)@ResponseBody@ResponseStatus(HttpStatus.BAD_REQUEST)public String handleNullPointerException(NullPointerException e) {// 返回一个包含异常信息的字符串return "请求参数错误:" + e.getMessage();} }在这个示例中,我们定义了一个名为`GlobalExceptionHandler`的类,并使用`@ControllerAdvice`注解标注该类。然后,我们定义了两个处理方法,分别处理所有异常和特定类型的异常(如`NullPointerException`)。在这些处理方法中,我们可以编写自己的异常处理逻辑,例如记录日志、返回自定义的错误信息等。
@ExceptionHandler注解
@ExceptionHandler注解是Spring框架中的一个注解,用于处理特定的异常。当在方法上使用此注解时,它将捕获由该方法抛出的异常,并执行相应的异常处理方法。这样可以避免程序因为未处理的异常而崩溃,提高程序的稳定性和可靠性。修饰声明在@ControllerAdvice类中的处理方法,处理Spring容器捕获的指定异常(全局异常处理)
@ResponseStatus注解
@ResponseStatus注解是Spring框架中的一个注解,用于指定HTTP响应的状态码。当在方法上使用此注解时,它将覆盖控制器中定义的默认状态码
@RestControllerAdvice
@RestControllerAdvice,整合@ControllerAdvice & @ResponseBody,直接返回json数据
出现错误也全部返回200状态码,之后再解析提取错误信息的设计,是不规范的
1.3HTTP状态码异常
ResponseStatusException异常是Spring Framework在需要设置响应状态码时抛出的异常。它继承自RuntimeException类,并接受两个参数:HTTP状态码和错误消息。此异常可用于控制器方法中,以向客户端返回特定的HTTP状态码和错误消息。例如,如果用户尝试更新一个不存在的记录,则可以抛出带有状态码404(未找到)和错误消息“记录未找到”的ResponseStatusException异常。
package com.handlingexception.service;
import com.handlingexception.exception.MyException;
import com.vo.Code;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import org.springframework.web.server.ResponseStatusException;import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;@Service
@Slf4j
public class UserService02 {public void readFile() {try {Files.readString(Path.of("A:/aa.aa"));} catch (IOException e) {// throw new MyException(500, "读取文件错误!" + e.getMessage());//throw new MyException(Code.readFile_ERR, "读取文件错误!" + e.getMessage());throw new ResponseStatusException(HttpStatus.NOT_FOUND,"读取文件错误");}}
}

二、数据校验
2.1概述
校验用户输入信息以维护数据完整性正确性,是应用程序逻辑的重要组成部分
The Java API for JavaBean Validation 2.0.2
- 标准化了Java EE平台的约束定义/描述//验证
- 提供了校验对象/属性/方法/构造函数的功能
Bean Validation内置基本校验约束,并允许开发人员扩展/自定义校验约束
基于Bea
- 基于Java EE标准,便于替换具体实现
- 支持国际化的错误信息描述Validation(Hibernate Validator 实现)
2.2相关依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2.3相关注解


2.4校验失败异常
实体类
package com.beanvalidation.entity;import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.Size;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;@Getter
@Setter
@NoArgsConstructor
public class User03 {private int id;@Size(min = 2, max = 6,message = "您输入的值为${validatedValue},用户名长度必须大于{min},小于{max}")private String name;@Min(value = 18,message = "您输入的值为${validatedValue},年龄不能小于{value}")@Max(value = 60,message = "您输入的值为${validatedValue},年龄不能大于{value}")private int age;@Email(message = "Email不合法")private String email;
}
控制类
package com.beanvalidation.controller;import com.beanvalidation.entity.User03;
import jakarta.validation.Valid;
import jakarta.validation.constraints.Size;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;import java.util.Map;@Slf4j
@RestController
@RequestMapping("/api/example03/")
//@Validated
public class ExampleController03 {@PostMapping("users")public Map postUser(@Valid @RequestBody User03 user) {return Map.of();}@GetMapping("users/{uid}/file")public void getTypeMismatchException(@PathVariable int uid) {}@GetMapping("users/{owner}")public void getViolationException(@Size(min = 2, max = 6, message = "用户信息错误")@PathVariable String owner) {}}
测试
POST http://localhost:8080/api/example03/users
Content-Type: application/json{"name": "T","age": 17,"email": "abc"
}
改进
异常处理类
package com.beanvalidation.controller;import com.beanvalidation.vo.ResultVO;
import com.fasterxml.jackson.databind.exc.InvalidFormatException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;import java.util.Set;@Slf4j
@RestControllerAdvice // 控制器增强器,用于全局异常处理
public class ExceptionController03 {/*** 属性校验失败异常处理器** @param exception MethodArgumentNotValidException异常对象* @return 返回一个包含错误信息的ResultVO对象*/@ExceptionHandler(MethodArgumentNotValidException.class) // 处理MethodArgumentNotValidException异常public ResultVO handleValidException(MethodArgumentNotValidException exception) {StringBuilder strBuilder = new StringBuilder(); // 用于拼接错误信息exception.getBindingResult() // 获取绑定结果对象.getFieldErrors() // 获取字段错误集合.forEach(e -> { // 遍历每个字段错误strBuilder.append(e.getField()); // 添加字段名strBuilder.append(": "); // 添加冒号分隔符strBuilder.append(e.getDefaultMessage()); // 添加默认错误信息strBuilder.append("; "); // 添加分号分隔符});return ResultVO.error(400, strBuilder.toString()); }
}

2.5请求地址参数类型转换异常
package com.beanvalidation.controller;import com.beanvalidation.vo.ResultVO;
import com.fasterxml.jackson.databind.exc.InvalidFormatException;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;import java.util.Set;@Slf4j
@RestControllerAdvice
public class ExceptionController03 {/*** 属性校验失败异常** @param exception* @return*/@ExceptionHandler(MethodArgumentNotValidException.class)public ResultVO handleValidException(MethodArgumentNotValidException exception) {StringBuilder strBuilder = new StringBuilder();exception.getBindingResult().getFieldErrors().forEach(e -> {strBuilder.append(e.getField());strBuilder.append(": ");strBuilder.append(e.getDefaultMessage());strBuilder.append("; ");});return ResultVO.error(400, strBuilder.toString());}/*** 请求类型转换失败异常** @param exception* @return*/@ExceptionHandler(MethodArgumentTypeMismatchException.class)public ResultVO handleMethodArgumentTypeMismatchException(MethodArgumentTypeMismatchException exception,HttpServletRequest request) {String msg = request.getRequestURI() +": " + "请求地址参数" + exception.getValue() + "错误";return ResultVO.error(400, msg.toString());}
}
String msg = request.getRequestURI() + ": " + "请求地址参数" + exception.getValue() + "错误";:这行代码首先获取请求的URI(统一资源标识符),然后拼接上字符串": "、"请求地址参数"、exception.getValue()(异常的值)和"错误",生成一个错误信息字符串msg。
测试
### 请求地址参数类型转换异常
GET http://localhost:8080/api/example03/users/aaa/file
2.6json类型转换异常
异常处理顺序:先类型转换,后校验。出现任何异常,不会进入controller处理方法
// 处理InvalidFormatException异常的方法
@ExceptionHandler(InvalidFormatException.class)
public ResultVO handleInvalidFormatException(InvalidFormatException exception) {// 创建一个StringBuilder对象,用于拼接错误信息StringBuilder strBuilder = new StringBuilder();// 遍历异常中的路径信息exception.getPath().forEach(p -> {// 拼接属性名、输入值和类型错误信息strBuilder.append("属性");strBuilder.append(p.getFieldName());strBuilder.append(",您输入的值:").append(exception.getValue());strBuilder.append(", 类型错误!");});// 返回一个包含错误信息的ResultVO对象,状态码为400return ResultVO.error(400, strBuilder.toString());
}
InvalidFormatException异常通常表示输入数据的格式不正确,无法按照预期的格式进行解析或处理。这可能是因为数据类型不匹配、数据结构错误或者数据内容不符合规范等原因导致的。在编程中,需要对输入数据进行合法性检查,并在发现异常时抛出InvalidFormatException异常,以便调用者能够及时处理并给出相应的提示信息。
测试
### json类型转换异常
POST http://localhost:8080/api/example03/users
Content-Type: application/json{"name": "e","age": "sdsd","email": "sdfsdf"
}
2.7请求地址参数校验
异常处理类
/*** 方法级参数校验失败异常** @param exception ConstraintViolationException类型的异常对象* @return 返回一个ResultVO类型的对象,包含错误信息和状态码*/
@ExceptionHandler(ConstraintViolationException.class)
public ResultVO handleConstraintViolationException(ConstraintViolationException exception) {// 创建一个StringBuilder对象,用于拼接错误信息StringBuilder strBuilder = new StringBuilder();// 获取异常对象中的约束违反集合Set<ConstraintViolation<?>> violations = exception.getConstraintViolations();// 遍历约束违反集合,将每个违反的错误信息拼接到StringBuilder中violations.forEach(v -> {strBuilder.append(v.getMessage()).append("; ");});// 返回一个ResultVO对象,包含错误信息和状态码400(表示请求参数错误)return ResultVO.error(400, strBuilder.toString());
}
ConstraintViolationException类是Java中的一个异常类,通常用于处理违反约束条件的情况。当在程序中对数据进行验证时,如果发现数据不符合预期的约束条件,就会抛出这个异常。例如,假设我们有一个用户实体类(User),其中包含用户名和密码两个属性。我们可以为这两个属性添加一些约束条件,例如用户名不能为空,密码长度必须大于等于8个字符等。在验证用户输入的数据时,如果发现违反了这些约束条件,就可以抛出
ConstraintViolationException异常。
配置类
package com.beanvalidation;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;@Configuration
public class SecurityConfiguration {// 定义一个名为methodValidationPostProcessor的Bean,类型为MethodValidationPostProcessor@Beanpublic MethodValidationPostProcessor methodValidationPostProcessor() {// 创建一个新的MethodValidationPostProcessor实例并返回return new MethodValidationPostProcessor();}}
MethodValidationPostProcessor(org.springframework.validation.beanvalidation)类,启动方法级校验
控制类
package com.beanvalidation.controller;import com.beanvalidation.entity.User03;
import jakarta.validation.Valid;
import jakarta.validation.constraints.Size;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;import java.util.Map;@Slf4j
@RestController
@RequestMapping("/api/example03/")
@Validated
public class ExampleController03 {@GetMapping("users/{owner}")public void getViolationException(@Size(min = 2, max = 6, message = "用户信息错误")@PathVariable String owner) {}}
@Validated注解
@Validated注解是Spring Validation框架中的一个注解,用于开启对方法参数的验证。它可以与@Valid注解一起使用,以确保在调用带有验证注解的方法之前,先对方法参数进行验证。
测试
### 请求地址参数校验
GET http://localhost:8080/api/example03/users/s
相关文章:
Springboot数据校验与异常篇
一、异常处理 1.1Http状态码 HTTP状态码是指在HTTP通信过程中,服务器向客户端返回的响应状态。它通过3位数字构成,第一个数字定义了响应的类别,后两位数字没有具体分类作用。以下是常见的HTTP状态码及其含义: - 1xx(信…...
第三十六章 XML 模式的高级选项 - 创建子类型的替换组
文章目录 第三十六章 XML 模式的高级选项 - 创建子类型的替换组创建子类型的替换组将子类限制在替换组中 第三十六章 XML 模式的高级选项 - 创建子类型的替换组 创建子类型的替换组 XML 模式规范还允许定义替换组,这可以是创建选择的替代方法。语法有些不同。无需…...
堆与二叉树(上)
本篇主要讲的是一些概念,推论和堆的实现(核心在堆的实现这一块) 涉及到的一些结论,证明放到最后,可以选择跳过,知识点过多,当复习一用差不多,如果是刚学这一块的,建议打…...
HBase查询的一些限制与解决方案
Apache HBase 是一个开源的、非关系型、分布式数据库,它是 Hadoop 生态系统的一部分,用于存储和处理大量的稀疏数据。HBase 在设计上是为了提供快速的随机读写能力,但与此同时,它也带来了一些查询上的限制: 没有SQL支持…...
软件开发 VS Web开发
我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版,欢迎购买。点击进入详情 目录 介绍: 角色和职责: 软件开发人员: Web开发人员: 技能: 软件开发人员: Web开发人…...
基于Springboot的旅游网站设计与实现(论文+调试+源码)
项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…...
【从零开始学习--设计模式--策略模式】
返回首页 前言 感谢各位同学的关注与支持,我会一直更新此专题,竭尽所能整理出更为详细的内容分享给大家,但碍于时间及精力有限,代码分享较少,后续会把所有代码示例整理到github,敬请期待。 此章节介绍策…...
条款6:若不想使用编译器自动生成的函数,就该明确拒绝
有些场景我们不需要编译器默认实现的构造函数,拷贝构造函数,赋值函数,这时候我们应该明确的告诉编译器,我们不需要,一个可行的方法是将拷贝构造函数和赋值函数声明为private。 class HomeForSale { ... }; HomeForSal…...
零基础也能制作家装预约咨询小程序
近年来,随着互联网的快速发展,越来越多的消费者倾向于使用手机进行购物和咨询。然而,许多家装实体店却发现自己的客流量越来越少,急需一种新的方式来吸引顾客。而开发家装预约咨询小程序则成为了一种利用互联网技术来解决这一问题…...
Mybatis的插件运⾏原理,如何编写⼀个插件?
🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🌺 仓库主页: Gitee 💫 Github 💫 GitCode 💖 欢迎点赞…...
C++复合数据类型:字符数组|读取键盘输入|简单读写文件
文章目录 字符数组(C风格字符串)读取键盘输入使用输入操作符读取单词读取一行信息getline使用get读取一个字符 读写文件 字符数组(C风格字符串) 字符串就是一串字符的集合,本质上其实是一个“字符的数组”。 在C中为了…...
Windows11环境下配置深度学习环境(Pytorch)
目录 1. 下载安装Miniconda2. 新建Python3.9虚拟环境3. 下载英伟达驱动4. 安装CUDA版Pytorch5. CPU版本pytorch安装6. 下载并配置Pycharm 1. 下载安装Miniconda 下载安装包:镜像文件地址 将Miniconda相关路径添加至系统变量的路径中。 打开Anaconda Powershell Pr…...
泛型深入理解
泛型的概述 泛型:是JDK5中引入的特性,可以在编译阶段约束操作的数据类型,并进行检查。 泛型的格式:<数据类型>; 注意:泛型只能支持引用数据类型。 集合体系的全部接口和实现类都是支持泛型的使用的。 泛型的…...
Linux内核模块
文章目录 一、内核模块介绍二、模块讲解1、最简模块代码:2、模块三要素3、常用操作命令3.1、 lsmod:显示已加载模块状态3.2、 insmod:载入模块3.3、rmmod:卸载模块3.4、dmesg:显示信息3.5、modinfo:显示ker…...
Java 栈和队列的交互实现
文章目录 队列和栈的区别一.用队列模拟实现栈1.1入栈1.2出栈1.3返回栈顶元素1.4判断栈是否为空 二.用栈模拟实现队列2.1 入队2.2出队2.3peek2.4判断队列是否为空 三.完整代码3.1 队列模拟实现栈3.2栈模拟实现队列 队列和栈的区别 栈和队列都是常用的数据结构,它们的…...
HarmonyOS应用开发者高级认证满分指南
声明:由于HarmonyOS应用开发者高级认证的题库一直在变,所以文章中的题目直做参考。 1. 判断题 云函数打包完成后,需要到APPGallery Connect创建对应函数的触发器才可以在端侧中调用。 【错】每一个自定义组件都有自己的生命周期。 【对】基…...
CSharp中Blazor初体验
Blazor 是一个由微软开发的开源 Web 框架,用于构建富客户端 Web 应用程序使用 C# 语言和 .NET 平台。Blazor 允许开发人员使用 C# 语言来编写前端 Web 应用程序,而不需要像传统的 JavaScript 框架(如 Angular、React 或 Vue.js)那…...
Linux下新建用户,并进行授权
注意:以下操作需要在root用户下! 新增用户 adduser 用户名设置密码 passwd 用户名更改目录所有者命令 chown -R 用户名:用户名 目录更改目录权限命令 chmod -R 755 目录...
STM32为基础的模拟I2C通用8bit和16bit读取以及多字节读取
GPIO模拟I2C驱动的通用代码,I2C的寄存器地址有8位和16位的,主要解决了同一个MCU同时处理8位和16位寄存器地址芯片时候的驱动问题。 typedef enum {IIC_8BIT_BASE_ADDR,IIC_16BIT_BASE_ADDR }iic_bits_e; typedef struct {uint8_t DevAddr;uint16_t RegA…...
算法训练营Day19
#Java #二叉树 #双指针 开源学习资料 Feeling and experiences: 二叉搜索树的最小绝对差:力扣题目链接 给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数,其数值等于两值之差的…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...
