小白初学SpringBoot记录
1.对于通过json返回用户信息时,需要忽略password字段操作:
1.1 pom配置jackson细节:
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.14.2</version></dependency>
在对应表的类加上注解(@JsonIgnoreProperties({"password"}))
@Data
@JsonIgnoreProperties({"password"})
public class User {private Integer id;//主键IDprivate String username; // 用户名//返回 的数据里忽略密码private String password;// 密码private String nickname; //昵称private String email;//邮箱private String userPic;// 用户头像private LocalDateTime createTime;// 创建时间private LocalDateTime updateTime;// 更新时间
}
返回数据的泛型类如下:
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Result<T> {private Integer code;private String message;private T data;public static <E> Result success(E data){return new Result<>(0,"操作成功",data);}public static Result success(){return new Result<>(0,"操作成功",null);}public static Result error(String message){return new Result<>(1,message,null);}
}
返回用户信息的路由信息:
@GetMapping("/userinfo")public Result<User> getUserinfo(@RequestHeader(name="Authorization") String token){try {Map<String, Object> stringObjectMap = JwtUtils.parseToken(token);String name = (String)stringObjectMap.get("username");User byName = userService.findByName(name);return Result.success(byName);}catch (Exception e){return Result.error("Token 过期");}}
2.添加拦截器,对除了部分请求外的所有请求进行JWT验证:
继承HandlerInterceptor接口,并且实现接口preHandle,
package org.example.Interceptors;import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.util.Enumeration;
import org.example.utils.JwtUtils;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;@Component
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {String token = request.getHeader("Authorization");try {JwtUtils.parseToken(token);return true;}catch (Exception e){response.setStatus(401);return false;}}
}
注册拦截器的实现:其中(excludePathPatterns("/user/login","user/register") 操作会忽略这个请求路径下的JWT验证)
package org.example.config;import org.example.Interceptors.LoginInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate LoginInterceptor loginInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginInterceptor).excludePathPatterns("/user/login","user/register");}
}
3.路由接口的参数校验使用validation
pom.xml 添加如下配置:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId> </dependency>
对于对应的controller类添加如下注解:
@Validated
public class UserController {
。。。
}
3.1普通参数类型校验
对于登录接口参数的校验如下:
@PostMapping("/login")
public Result login(@Pattern(regexp = "^[a-zA-Z][a-zA-Z0-9]{4,16}$") String username,@Pattern(regexp = "^[a-zA-Z0-9]{5,16}$") String password){}
可以添加Pattern注解,并使用正则表达式验证。@Pattern(regexp = "^[a-zA-Z][a-zA-Z0-9]{4,16}$")
3.2对于类对象格式校验:
此方法存在controller类内
@PutMapping("/update")public Result updateUserInfo(@RequestBody @Validated User user){}
@RequestBody 用户获取用户json格式传过来的参数,直接初始化类User。
User类如下:
@Data
@NoArgsConstructor
@JsonIgnoreProperties({"password"})
public class User {@NonNullprivate Integer id;//主键IDprivate String username; // 用户名//返回 的数据里忽略密码private String password;// 密码@NotEmpty@Pattern(regexp = "^[a-zA-Z0-9]{5,10}$")private String nickname; //昵称@NotEmpty@Emailprivate String email;//邮箱private String userPic;// 用户头像private LocalDateTime createTime;// 创建时间private LocalDateTime updateTime;// 更新时间
}
@Data注解是lombok依赖,可以在编译的时候帮助生成默认的getter,setter方法。
pom.xml添加如下:
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.32</version> </dependency>
对于类对象的属性值校验使用的
@NonNull 不为null
@NotEmpty 不为null并且字符串时不为空 @Pattern(regexp = "^[a-zA-Z0-9]{5,10}$") 正则校验传入的别名
@Email 邮箱格式校验
在未添加 注解@NoArgsConstructor时,从postman模拟update时出现如下错误:
Cannot construct instance of `org.example.pojo.User` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator)
原因:缺少无参构造器
Jackson 反序列化时必须通过无参构造器创建对象,再通过 Setter 注入属性
- 当前类使用 Lombok
@Data
注解,但未显式添加@NoArgsConstructor
,导致编译后无默认构造器
- 即使 Lombok 默认生成无参构造器,若存在其他构造器(如全参构造器),则不再自动生成
因此需要加上@NoArgsConstructor注解。
相关文章:
小白初学SpringBoot记录
1.对于通过json返回用户信息时,需要忽略password字段操作: 1.1 pom配置jackson细节: <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>…...

OSCP备战-BSides-Vancouver-2018-Workshop靶机详细步骤
一、靶机介绍 靶机地址:https://www.vulnhub.com/entry/bsides-vancouver-2018-workshop%2C231/ 靶机难度:中级(CTF) 靶机发布日期:2018年3月21日 靶机描述: Boot2root挑战旨在创建一个安全的环境&…...

PDF转Markdown/JSON软件MinerU最新1.3.12版整合包下载
MinerU发布至今我已经更新多版整合包了,5天前MinerU发布了第一个正式版1.0.1,并且看到在18小时之前有更新模型文件,我就做了个最新版的一键启动整合包。 2025年02月21日更新v1.1.0版整合包 2025年02月27日更新v1.2.0版整合包 2025-06-05 更…...
Android第十三次面试总结基础
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...

【深入学习Linux】System V共享内存
目录 前言 一、共享内存是什么? 共享内存实现原理 共享内存细节理解 二、接口认识 1.shmget函数——申请共享内存 2.ftok函数——生成key值 再次理解ftok和shmget 1)key与shmid的区别与联系 2)再理解key 3)通过指令查看/释放系统中…...

编程基础:执行流
能帮到你的话,就给个赞吧 😘 文章目录 执行流同步:顺序执行,只有一个执行流异步:新开后台(次)执行流,后台执行流要确保不能影响主执行流。共有两个执行流。 阻塞:任务阻塞执行流,导致…...

理解非结构化文档:将 Reducto 解析与 Elasticsearch 结合使用
作者:来自 Elastic Adel Wu 演示如何将 Reducto 的文档处理与 Elasticsearch 集成以实现语义搜索。 Elasticsearch 与业界领先的生成式 AI 工具和提供商有原生集成。欢迎观看我们的网络研讨会,了解如何超越 RAG 基础,或使用 Elastic 向量数据…...
算法训练第十天
232. 用栈实现队列 代码: class MyQueue(object):def __init__(self):self.arr1 []self.arr2 []def push(self, x):""":type x: int:rtype: None"""self.arr1.append(x)def pop(self):""":rtype: int""…...
2种官方方法关闭Windows防火墙
2种官方方法关闭Windows防火墙 引言一、防火墙:你电脑的"智能安检员"二、这些场景,可能需要"临时撤防"三、极速关闭方案方法一:通过系统设置(Win10/11专属通道)方法二:通过传统控制面板(全系统通用:Win7-11全系)四、 必读安全警告(关闭前请三思!…...

[面试精选] 0094. 二叉树的中序遍历
文章目录 1. 题目链接2. 题目描述3. 题目示例4. 解题思路5. 题解代码6. 复杂度分析 1. 题目链接 94. 二叉树的中序遍历 - 力扣(LeetCode) 2. 题目描述 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 3. 题目示例 示例 1 : 输入&…...
股指期货期权交易规则是什么?
本文主要介绍股指期货期权交易规则是什么?股指期货期权是以股指期货合约为标的物的期权交易,其规则结合了期货与期权的特点。 股指期货期权交易规则是什么? 一、基础交易规则 交易时间 交易日9:30-11:30,13:00-15:00࿰…...

学习笔记(23): 机器学习之数据预处理Pandas和转换成张量格式[1]
学习笔记(23): 机器学习之数据预处理Pandas和转换成张量格式[1] 学习机器学习,需要学习如何预处理原始数据,这里用到pandas,将原始数据转换为张量格式的数据。 1、安装pandas pip install pandas 2、写入和读取数据 >>创建一个人工…...

2025年6月6日第一轮
2025年6月6日 The rapid in Chiese industdy is developnig e,and it is From be in a enjoy a deep is developing The drone industry in China is developing The drone industy in china develops rapidly and is in a leading position in in the world. The dro…...
记一次运行spark报错
提交spark任务运次报错 06/03 18:27:50 INFO Client: Setting up container launch context for our AM 25/06/03 18:27:50 INFO Client: Setting up the launch environment for our AM container 25/06/03 18:27:50 INFO Client: Preparing resources for our AM container …...

12-Oracle 23ai Vector 使用ONNX模型生成向量嵌入
一、Oracle 23ai Vector Embeddings 核心概念 向量嵌入(Vector Embeddings) -- 将非结构化数据(文本/图像)转换为数值向量 - - 捕获数据的语义含义而非原始内容 - 示例:"数据库" → [0.24, -0.78, 0.5…...
2. 库的操作
2.1 创建数据库 语法: CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification: [DEFAULT] CHARACTER SET charset_name # 字符集: 存储编码 [DEFAULT] COLLATE collation_name # 校验集: 比较/选择/读…...

pytorch 与 张量的处理
系列文章目录 文章目录 系列文章目录一、Tensor 的裁剪二、Tensor 的索引与数据筛选torch.wheretorch.indicestorch.gathertorch.masked_selecttorch.taketorch.nonzero(省略) 三、Tensor 的组合与拼接torch.cattorch.stack 四、Tensor的切片chunksplit …...

layer norm和 rms norm 对比
Layer norm # Layer Norm 公式 mean x.mean(dim-1, keepdimTrue) var x.var(dim-1, keepdimTrue) output (x - mean) / sqrt(var eps) * gamma beta特点: 减去均值(去中心化)除以标准差(标准化)包含可学习参数 …...

Java高级 | 【实验六】Springboot文件上传和下载
隶属文章:Java高级 | (二十二)Java常用类库-CSDN博客 系列文章:Java高级 | 【实验一】Springboot安装及测试 |最新-CSDN博客 Java高级 | 【实验二】Springboot 控制器类相关注解知识-CSDN博客 Java高级 | 【实验三】Springboot 静…...
RKNN开发环境搭建1-基于Ubuntu 18.04系统使用Docker安装rknn-toolkit2
目录 写在最前面Docker 方式安装rknn-toolkit2写在最前面 瑞芯微在RKNN的环境搭建方面的资料很多,但是在搭建过程中发现很多问题教程中并未提及,对初学者不友好。所以博主做了这个系列的文章,从开始搭建环境到对于RKNN Model Zoo的示例进行实践,希望能对初学者有帮助。坚持…...
qt使用笔记二:main.cpp详解
Qt中main.cpp文件详解 main.cpp是Qt应用程序的入口文件,包含程序的启动逻辑。下面我将详细解析其结构和功能。 基本结构 一个典型的Qt main.cpp 文件结构如下: #include <QApplication> // 或者 QGuiApplication/QCoreApplication #include &…...

VBA进度条ProgressForm1
上一章《VBA如何使用ProgressBar进度条控件》介绍了ProgressBar控件的使用方法,今天我给大家介绍ProgressForm1进度条的使用方法,ProgressForm1是集成ProgressBar控件和Label控件的窗体,可以同时显示进度条和百分比,如下图&#x…...

行为型设计模式之Interpreter(解释器)
行为型设计模式之Interpreter(解释器) 前言: 自己的话理解:自定义一个解释器用来校验参数或数据是否合法。 1)意图 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解…...

深入解析 CAS 操作
一、CAS 的本质:硬件级别的乐观锁 CAS(Compare-And-Swap,比较并交换) 是一种原子操作指令,用于实现对共享变量的无锁并发修改。它是现代多核处理器支持的底层硬件指令,也是构建高效并发数据结构࿰…...

vue3+TS+eslint9配置
记录eslint升级到9.x的版本之后遇到的坑 在 ESLint 9 中,配置方式发生了变化。Flat Config 格式(eslint.config.js 或 .ts)不再支持 extensions 选项。所以vscode编辑器中的 extensions 需要注释掉,要不然保存的时候不会格式化。…...

【bug】Error: /undefinedfilename in (/tmp/ocrmypdf.io.9xfn1e3b/origin.pdf)
在使用ocrmypdf的时候,需要Ghostscript9.55及以上的版本,但是ubuntu自带为9.50 然后使用ocrmypdf报错了 sudo apt update sudo apt install ghostscript gs --version 9.50 #版本不够安装的版本为9.50不够,因此去官网https://ghostscript.c…...
HarmonyOS5.0——CodeGenie:鸿蒙生态的AI编程革命
CodeGenie:鸿蒙生态的AI编程革命 华为推出的 CodeGenie 是集成于 DevEco Studio 的 AI 辅助编程工具,专为 HarmonyOS 应用开发设计。它通过深度优化 ArkTS 和 C 语言的代码生成能力,显著提升开发效率,降低鸿蒙生…...
【Dv3Admin】系统视图字典管理API文件解析
业务系统中静态数据管理常被忽视,但它直接影响到扩展性与维护效率。字典模块通过集中管理各类基础数据,避免硬编码,使系统具备更高的灵活性和适配能力,成为后台管理平台的重要基础组件。 文章解析 dvadmin/system/views/dictiona…...
免费 SecureCRT8.3下载、安装、注册、使用与设置
参考:SecureCRT 8.3中文 安装教程 - Hope - 博客园...

Redis :String类型
String类型 String是Redis中的字符串,是Redis中最基本的数据类型,直接是按照二进制数据的进行存储 Redis中的所有key都是String类型,但是value是有差别的 常见的命令 set 将String类型的value存储到key中,如果之间有相同的ke…...