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 ,返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数,其数值等于两值之差的…...
C++数据结构——二叉搜索树详解
目录 一,关于二叉搜索树 1.1 概念 1.2 基本结构 二,二叉搜索树接口实现 2.1 插入 2.2 查找 2.3 打印 2.4* 删除 三,二叉搜索树接口递归实现 3.1 查找 3.2 插入 3.3 删除 四,二叉搜索树的默认成员函数 五,…...
ros2机器人在gazebo中移动方案
原文连接Gazebo - Docs: Moving the robot (gazebosim.org) 很重要的地方:使用虚拟机运行Ubuntu的时候,需要关闭”加速3D图形“的那个选项,否则gazebo无法正常显示。 Moving the robot(使用命令移动机器人示例) In t…...
学习Java第74天,Ajax简介
什么是ajax AJAX Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。 AJAX 不是新的编程语言,而是一种使用现有标准的新方法。 AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页…...
【Java面试题】在Java中String,Stringbuffer,StringBuilder的区别?
Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍在Java中String,Stringbuffer,StringBuilder的区别以及部分理论知识 🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁 🍉博主收将持续更新学习记录…...
让AIGC成为你的智能外脑,助力你的工作和生活
人工智能成为智能外脑 在当前的科技浪潮中,人工智能技术正在以前所未有的速度改变着我们的生活和工作方式。其中,AIGC技术以其强大的潜力和广泛的应用前景,正在引领着这场革命。 AIGC技术是一种基于人工智能的生成式技术,它可以通…...
ubuntu12.04 源
替换 /etc/apt/sources.list deb http://old-releases.ubuntu.com/ubuntu precise main restricted universe multiverse deb http://old-releases.ubuntu.com/ubuntu precise-security main restricted universe multiverse deb http://old-releases.ubuntu.com/ubu…...
openssl数据压缩
介绍 数据压缩是将原有数据通过某种压缩算法计算得到相对数据量小的过程。这种过程是可逆的,即能通过压缩后的数据恢复出原数据。数据压缩能够节省存储空间,减轻网络负载。 在即需要加密又需要压缩的情况下,必须先压缩再加密,次…...
SQLturning:定位连续值范围起点和终点
在上一篇blog说到,如何去优化查询连续值范围,没看过的朋友,上篇blog链接[在此]。(https://blog.csdn.net/weixin_42575078/article/details/135067645?spm1001.2014.3001.5501) 那么今天来说说怎么将连续的数据合并,然后返回合并…...
饥荒Mod 开发(十七):手动保存和加载,无限重生
饥荒Mod 开发(十六):五格装备栏 饥荒Mod 开发(十八):Mod 添加配置选项 饥荒游戏会自动保存,本来是一个好的机制,但是当角色死亡的时候存档会被删除,又要从头开始,有可能一不小心玩了很久的档就直接给整没了…...
Skywalking系列之最新版9.2.0-JavaAgent本地构建
MAC 10.15.7IDEA 2021.2skywalking-agent 9.2.0-SNAPSHOTJDK 17/21 (最新的代码要看最新的要求,注意不能使用JDK8,会构建失败)Maven 3.6.0 关于本地构建JavaAgent源码 1、获取源码,加载submodule 分步执行: git clone https:/…...
佛山格尔做网站的公司/百度收录的网页数量
Linux系统中查看CPU和内存使用情况,是一个运维工程师常见的事情,下面分享一下。 目 录 1.top命令 2.ps命令 3.free命令 1.top命令 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windo…...
wordpress丢失网络连接/电商运营一天都干啥
之前最喜欢使用的node.js,现在很少用了,做个小型应用还是真的挺不错的推荐这个系统DoraCMS 针对近期同学们提出的问题,做了部分更新,同时也新增了一些使用功能,具体情况如下:1. 抽离了邮件发送为独立插件2. 新增邮件管…...
网站建设面临的困难/什么是搜索引擎优化?
上 看了一下以前的写的最新博客是在4月份。。 大二上就不说了,打了一学期游戏。大二下本来想自己写写东西,既然没有项目经验自己找事做,就打算写写网络硬盘,当时对前端十分敢兴趣,毕竟刚看完李炎恢的视频嘛ÿ…...
石家庄专业网站设计电话/百度电话号码查询平台
box-shadow 以逗号分割列表来描述一个或多个阴影效果,可以用到几乎任何元素上。 如果元素同时设置了 border-radius ,阴影也会有圆角效果。多个阴影时和多个 text shadows 规则相同(第一个阴影在最上面)。默认值: none 不可继承值: inset 默…...
做网站要不要签合同/互联网营销师是干什么的
12、请描述OSI7层模型各层名字及功能,并举例在不同层对应的协议 第一层:物理层,利用传输介质为数据提供物理连接, 对应的协议:ARP 第二层:数据链路层:建立和管理各节点间的链接链路 对应的协议&…...
网站开发怎么自动获取位置/做网页怎么做
目录 一、scala运算符本质 二、算术运算符 三、逻辑运算符 四、关系运算符 注:scala 与equals区别 五、赋值运算符 六、位运算符 一、scala运算符本质 在Scala中其实是没有运算符的,所有运算符都是方法。 1)当调用对象的方法时&#…...